Android懸浮視窗的實現
阿新 • • 發佈:2019-01-01
最近在做一個流量統計的,有個懸浮窗會像樣點。所以稍微研究了下懸浮視窗的實現:效果圖如下:做了個透明背景。。。
- 懸浮視窗需要在主介面出現,就算APP被關閉了,因此懸浮視窗應該用一個service來控制;
- 既然懸浮視窗高於其他應用顯示在手機上,那控制懸浮視窗的應該是系統類,其中WindowManger為懸浮視窗主要實現類;
WindowManager:視窗管理器,往視窗上新增和刪除一個控制元件,主要有一下步驟:
(1)首先獲取WindowManager物件,
WindowManager mWindowManager=
getApplication().getSystemService (getApplication().WINDOW_SERVICE);
(2)設定懸浮控制元件的樣式,WindowManager物件,對於控制元件的樣式有專門的類進行封裝:WindowManager.LayoutParams,
重要的屬性和方法:
LayoutParams.x 設定控制元件預設在螢幕的x軸
LayoutParams.y 設定控制元件預設在螢幕的y軸
LayoutParams.gravity 設定控制元件在螢幕的gravity
LayoutParams.format 設定控制元件在螢幕
LayoutParams.width 設定控制元件的寬度
……詳細請參考API文件
如下:
//獲取param物件 WindowManager.LayoutParam wmParams=new WindowManager.LayoutParams(); //調整懸浮窗顯示的停靠位置為左側置頂 wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 以螢幕左上角為原點,設定x、y初始值 wmParams.x = 0; wmParams.y = 0; //設定懸浮視窗長寬資料 wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
3、將自定義的view和上面定義的wmParams樣式新增到視窗中,作為懸浮窗
LayoutInflater inflater = LayoutInflater.from(getApplication());
//獲取浮動視窗檢視所在佈局
LinearLayout mFloatLayout = (LinearLayout) inflater.inflate(R.layout.flow_window, null);
//新增mFloatLayout
mWindowManager.addView(mFloatLayout, wmParams);
4、移除該懸浮窗
mWindowManager.removeViewImmediate (View view)
“`
自此,可以輕鬆將一個控制元件懸浮在手機上,該懸浮視窗會高於一切,無論在任何介面它都會出現,無法比較“智慧化”,即只有在手機主介面(一級介面)才顯示,其他時候不顯示,要怎麼做?
思路是:由於我是用懸浮來做手機流量的更新,因此只要更新的時候,我判斷一下現在手機顯示的介面是否為主介面,如果不是,我就隱藏起來,就可以了。