在Android中使用WindowManager實現懸浮窗口

最近在做一個項目的過程中,客戶提出要一個能懸浮於所有應用的界面。下圖右側這個界面就是需要實現的懸浮於所有應用之上的視圖。
下面就介紹一下如何通過WindowManager來實現這個效果。

 

通過WindowManager的addView()方法,並設置WindowManager.LayoutParams的相關屬性,就可以往WindowManager中加入所需要的View,而根據WindowManager.LayoutParams屬性不同,也就能實現不同的效果。比如創建系統頂級窗口,實現懸浮窗口效果。如果需要將View從WindowManager中移除,隻需要調用removeView()即可。

下面以一個簡單的例子來解釋一下如何實現懸浮窗口效果。

首先,得到WindoeManager對象:
        WindowManager wManager = getApplicationContext().getSystemService( Context. WINDOW_ SERVICE);

其次,得到WindowManager.LayoutParams對象,為後續設置相關參數做準備:
        private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();

接著,設置相關的窗口佈局參數,要實現懸浮窗口效果,主要需要設置的參數有:
        wmParams.type = LayoutParams.TYPE_PHONE; // 設置window type
        wmParams.format = PixelFormat.RGBA_8888; // 設置圖片格式,效果為背景透明

        /*
        * 下面的flags屬性的效果形同“鎖定”。 懸浮窗不可觸摸,不接受任何事件,同時不影響後面的事件響應。
        */
        wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
        LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
wmParams.gravity = Gravity.RIGHT| Gravity. CENTER_VERTICAL; // 調整懸浮窗口至右側中間
         // 以屏幕左上角為原點,設置x、y初始值
         wmParams.x = 0;
        wmParams.y = 0;

// 設置懸浮窗口長寬數據
        wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;;
         wmParams.height =WindowManager.LayoutParams.WRAP_CONTENT;;

然後,就可以將需要加到懸浮窗口中的View加入到窗口中瞭:
        if(view.getParent==null)//如果view沒有被加入到某個父組件中,則加入WindowManager中
        wManager.addView(view,wmParams);

其中,view為需要放到懸浮窗口中的視圖組件。

如果要將其從WindowManager中移除,則可以執行以下語句:
        if(view.getParent()!=null)
        wManager.removeView(view);

最後,還有需要註意的是,如果要用懸浮窗口,需要在AndroidManifest.xml中加入如下的權限:
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

You May Also Like