使用WindowManager添加View——悬浮窗口的基本原理
Android系統中的“窗口”類型雖然很多,但只有兩大類是經常使用的:一是由系統進程管理的,稱之為“系統窗口”;第二個就是由應用程序產生的,用于顯示UI界面的“應用窗口”。如果大家熟悉WindowManagerService(窗口管理機制WMS)的話,那么一切都很簡單。它是一個負責統籌管理所有窗口的一個服務,從始到終一直在運作。之所以扯上WMS,因為它才是大Boss,所有的窗口變化都要通知到它。而WindowManager雖然與它沒有之間的關系,但是對它負責,所有信息會經過一定的途徑傳回到WMS中。額,跑題了,我們說的是WindowManager,它是一個接口類,它可以實現對view的管理,包括增加,更新和刪除。
?
一、WindowManager
wManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
在Activity和Service中都可以直接使用這個方法來獲得WindowManager。其getSystemService返回的是一個WindowManagerImpl對象,這是一個存在于本地進程中的一個對象。而事實是WindowManagerImpl繼承了WindowManager,而WindowManger繼承了ViewManager。
LayoutParams里面存放著的是窗口的屬性,通過這個變量,可以為窗口賦予各式的屬性。也可以改變它的屬性值,來進行各種各樣的操作,像懸浮窗口的拖動,拉伸等操作。
詳細的屬性表在:
http://www.cnblogs.com/shitianzeng/articles/2814050.html
(1)窗口添加 public void addView(View view, ViewGroup.LayoutParams params);
(2)窗口更新
public void updateViewLayout(View view, ViewGroup.LayoutParams params);(3)窗口刪除
public void removeView(View view);以上的三個方法都存在于ViewManager中。
二、懸浮窗實例
????????? 例子設計:利用service打開懸浮窗,其中放著一個自定義的View,點擊消除懸浮窗。
public class WindowService extends Service implements OnClickListener {private WindowManager wManager;// 窗口管理者private WindowManager.LayoutParams mParams;// 窗口的屬性private MyView myView;private boolean flag = true;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubwManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);mParams = new WindowManager.LayoutParams();mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 系統提示windowmParams.format = PixelFormat.TRANSLUCENT;// 支持透明//mParams.format = PixelFormat.RGBA_8888;mParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 焦點mParams.width = 490;//窗口的寬和高mParams.height = 160;mParams.x = 0;//窗口位置的偏移量mParams.y = 0;//mParams.alpha = 0.1f;//窗口的透明度myView = new MyView(this);myView.setOnClickListener(this);super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubif (flag) {flag = false;wManager.addView(myView, mParams);//添加窗口 }return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubif (myView.getParent() != null)wManager.removeView(myView);//移除窗口super.onDestroy();}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (v.equals(myView)) {flag = true;if (myView.getParent() != null)wManager.removeView(myView);//移除窗口}}}
?
很早以前寫的surfaceView,里面包括文字圖片的兩個顯示動畫
看看就行了
@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubLog.d("CPACM","onTouchEvent");Intent intent = new Intent();intent.setClass(this, WindowService.class);startService(intent);this.finish();return super.onTouchEvent(event);}
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 使用SYSTEM_ALERT_WINDOW時必須要加 -->
?
?
三、結束語
學到越深,發現需要學的越多!
總結
以上是生活随笔為你收集整理的使用WindowManager添加View——悬浮窗口的基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android--添加子视图(addVi
- 下一篇: ViewTreeObserver