近在做一個項目的過程中,客戶提出要一個能懸浮于所有應(yīng)用的界面。下圖右側(cè)這個界面就是需要實現(xiàn)的懸浮于所有應(yīng)用之上的視圖。
下面就介紹一下如何通過WindowManager來實現(xiàn)這個效果。

通過WindowManager的addView()方法,并設(shè)置WindowManager.LayoutParams的相關(guān)屬性,就可以往WindowManager中加入所需要的View,而根據(jù)WindowManager.LayoutParams屬性不同,也就能實現(xiàn)不同的效果。比如創(chuàng)建系統(tǒng)頂級窗口,實現(xiàn)懸浮窗口效果。如果需要將View從WindowManager中移除,只需要調(diào)用removeView()即可。
下面以一個簡單的例子來解釋一下如何實現(xiàn)懸浮窗口效果。
首先,得到WindoeManager對象:
WindowManager wManager = getApplicationContext().getSystemService( Context. WINDOW_ SERVICE);
其次,得到WindowManager.LayoutParams對象,為后續(xù)設(shè)置相關(guān)參數(shù)做準(zhǔn)備:
private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
接著,設(shè)置相關(guān)的窗口布局參數(shù),要實現(xiàn)懸浮窗口效果,主要需要設(shè)置的參數(shù)有:
wmParams.type = LayoutParams.TYPE_PHONE; // 設(shè)置window type
wmParams.format = PixelFormat.RGBA_8888; // 設(shè)置圖片格式,效果為背景透明
/*
* 下面的flags屬性的效果形同“鎖定”。 懸浮窗不可觸摸,不接受任何事件,同時不影響后面的事件響應(yīng)。
*/
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
wmParams.gravity = Gravity.RIGHT| Gravity. CENTER_VERTICAL; // 調(diào)整懸浮窗口至右側(cè)中間
// 以屏幕左上角為原點,設(shè)置x、y初始值
wmParams.x = 0;
wmParams.y = 0;
// 設(shè)置懸浮窗口長寬數(shù)據(jù)
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中移除,則可以執(zhí)行以下語句:
if(view.getParent()!=null)
wManager.removeView(view);
后,還有需要注意的是,如果要用懸浮窗口,需要在AndroidManifest.xml中加入如下的權(quán)限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />