Android利用WindowManager實(shí)現(xiàn)懸浮窗
前言
你會發(fā)現(xiàn)QQ視頻的時候,就算手機(jī)回到主頁,視頻小模塊依舊能懸浮在桌面上。還有當(dāng)年很火的各種手機(jī)殺毒軟件的桌面小助手,總能在呆在桌面。這種懸浮窗的操作就需要用到Window。
效果
gif圖看著有點(diǎn)兒卡,其實(shí)實(shí)際上還是很流暢的。
Window
Window即窗口,是個抽象類,具體實(shí)現(xiàn)就是PhoneWindow,對就是那個裝著DecorView的PhoneWindow。
Window整體分三種類型:應(yīng)用Window、子Window、系統(tǒng)Window。
- 應(yīng)用Window:對應(yīng)一個Activity
- 子Window:不能單獨(dú)存在,它需要附屬在特定的父Window中,比如常見的一些Dialog就是子Window。
- 系統(tǒng)Window:需要聲明權(quán)限才能用,Toast就是一種系統(tǒng)Window。
每種Window類型又能分多個層級:
層級高的Window會覆蓋層級低的Window,跟Android5.0引入的Z軸類似。
權(quán)限
Android6.0以上,如果要用系統(tǒng)Window,我們需要申請懸浮窗權(quán)限。畢竟WindowManager.LayoutParams.TYPE_TOAST權(quán)限限制太多了。
Manifests:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
判斷是否有懸浮窗權(quán)限:
Settings.canDrawOverlays(this)
申請權(quán)限:
Intent intent = new Intent(); intent.setAction(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:"+getPackageName())); startActivity(intent);
WindowManager
View想要呈現(xiàn)出來,必須要通過Window,但是我們無法直接操作Window,需要用到WindowManager。
WindowManager 獲取對象:
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
WindowManager 繼承了 ViewManager,操作View總共只有這三個方法:
public interface ViewManager { /** * Assign the passed LayoutParams to the passed View and add the view to the window. * <p>Throws {@link android.view.WindowManager.BadTokenException} for certain programming * errors, such as adding a second view to a window without removing the first view. * <p>Throws {@link android.view.WindowManager.InvalidDisplayException} if the window is on a * secondary {@link Display} and the specified display can't be found * (see {@link android.app.Presentation}). * @param view The view to be added to this window. * @param params The LayoutParams to assign to view. */ public void addView(View view, ViewGroup.LayoutParams params); public void updateViewLayout(View view, ViewGroup.LayoutParams params); public void removeView(View view); }
分別是增加View、更新View和刪除View。
WindowManager參數(shù)設(shè)置
由上可知:addView 和 updateViewLayout時,需要用到LayoutParams。
這里來舉個栗子:
wParamsTop = new WindowManager.LayoutParams(); wParamsTop.width = WindowManager.LayoutParams.WRAP_CONTENT; wParamsTop.height = WindowManager.LayoutParams.WRAP_CONTENT; //初始化坐標(biāo) wParamsTop.x = 0; wParamsTop.y = 0; //彈窗類型為系統(tǒng)Window wParamsTop.type = WindowManager.LayoutParams.TYPE_PHONE; //以左上角為基準(zhǔn) wParamsTop.gravity = Gravity.START | Gravity.TOP; wParamsTop.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; //如果不加,背景會是一片黑色。 wParamsTop.format = PixelFormat.RGBA_8888;
type參數(shù)上面講過了,這里來看看主要的flag參數(shù)。
- FLAG_NOT_FOCUSABLE:表示W(wǎng)indow不需要獲取焦點(diǎn),也不需要接收各種輸入事件,此標(biāo)記會同時啟用FLAG_NOT_TOUCH_MODAL,最終事件會直接傳遞給下層具有焦點(diǎn)的Window。
- FLAG_NOT_TOUCH_MODAL:在此模式下,系統(tǒng)會將當(dāng)前Window區(qū)域以外的點(diǎn)擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域以內(nèi)的點(diǎn)擊事件則自己處理。
- FLAG_SHOW_WHEN_LOCKED:開啟此模式可以讓window顯示在鎖屏界面。
Demo
利用ActivityLifecycleCallbacks實(shí)現(xiàn)了前后臺的監(jiān)聽,切換到后臺時隱藏了懸浮窗。感興趣的可以看看這篇文章:ActivityLifecycleCallbacks 判斷APP是否在前臺。
上面的logo和下面的viewpager是兩個view ,通過調(diào)用兩次addview實(shí)現(xiàn)的效果。
源碼下載:Android利用WindowManager實(shí)現(xiàn)懸浮窗
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android使用CardView實(shí)現(xiàn)圓角對話框
這篇文章主要為大家詳細(xì)介紹了Android使用CardView實(shí)現(xiàn)圓角對話框,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11Android集成騰訊X5實(shí)現(xiàn)文檔瀏覽功能
Android內(nèi)部沒有控件來直接顯示文檔,跳轉(zhuǎn)WPS或其他第三方文檔App體驗(yàn)性不好,使用騰訊X5內(nèi)核能很好的解決的這一問題這篇文章主要介紹了Android集成騰訊X5實(shí)現(xiàn)文檔瀏覽功能,需要的朋友可以參考下2019-10-10ExpandableListView實(shí)現(xiàn)二級列表購物車
這篇文章主要為大家詳細(xì)介紹了ExpandableListView實(shí)現(xiàn)二級列表購物車,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11Android設(shè)置TextView首行縮進(jìn)示例代碼
使用過word的都會知道,在文字排版的時候經(jīng)常要設(shè)置首行縮進(jìn),這樣才會使排版更整齊,那么在Android中當(dāng)需要設(shè)置首行縮進(jìn)的時候該腫么辦呢,下面一起來看看。2016-08-08Android實(shí)現(xiàn)獲取聯(lián)系人電話號碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)獲取聯(lián)系人電話號碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03Android的OkHttp包中的HTTP攔截器Interceptor用法示例
攔截器是OkHttp處理HTTP請求方面所具有的一個強(qiáng)大特性,這里我們就來看一下Android的OkHttp包中的HTTP攔截器Interceptor用法示例,需要的朋友可以參考下2016-07-07Android開發(fā)之CheckBox的簡單使用與監(jiān)聽功能示例
這篇文章主要介紹了Android開發(fā)之CheckBox的簡單使用與監(jiān)聽功能,結(jié)合簡單實(shí)例形式分析了Android使用CheckBox控件的布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07Android右滑返回上一個界面的實(shí)現(xiàn)方法
這篇文章主要介紹了Android右滑返回上一個界面的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10