国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android利用WindowManager實現懸浮窗

2019-10-21 21:46:02
字體:
來源:轉載
供稿:網友

前言

你會發現QQ視頻的時候,就算手機回到主頁,視頻小模塊依舊能懸浮在桌面上。還有當年很火的各種手機殺毒軟件的桌面小助手,總能在呆在桌面。這種懸浮窗的操作就需要用到Window。

效果

gif圖看著有點兒卡,其實實際上還是很流暢的。

Android,WindowManager,懸浮窗

Window

Window即窗口,是個抽象類,具體實現就是PhoneWindow,對就是那個裝著DecorView的PhoneWindow。

Window整體分三種類型:應用Window、子Window、系統Window。

  • 應用Window:對應一個Activity
  • 子Window:不能單獨存在,它需要附屬在特定的父Window中,比如常見的一些Dialog就是子Window。
  • 系統Window:需要聲明權限才能用,Toast就是一種系統Window。

每種Window類型又能分多個層級:

Android,WindowManager,懸浮窗

層級高的Window會覆蓋層級低的Window,跟Android5.0引入的Z軸類似。

權限

Android6.0以上,如果要用系統Window,我們需要申請懸浮窗權限。畢竟WindowManager.LayoutParams.TYPE_TOAST權限限制太多了。

Manifests:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

判斷是否有懸浮窗權限:

Settings.canDrawOverlays(this)

申請權限:

Intent intent = new Intent();intent.setAction(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);intent.setData(Uri.parse("package:"+getPackageName()));startActivity(intent);

WindowManager

View想要呈現出來,必須要通過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參數設置

由上可知:addView 和 updateViewLayout時,需要用到LayoutParams。 
這里來舉個栗子:

wParamsTop = new WindowManager.LayoutParams();wParamsTop.width = WindowManager.LayoutParams.WRAP_CONTENT;wParamsTop.height = WindowManager.LayoutParams.WRAP_CONTENT;//初始化坐標wParamsTop.x = 0;wParamsTop.y = 0;//彈窗類型為系統WindowwParamsTop.type = WindowManager.LayoutParams.TYPE_PHONE;//以左上角為基準wParamsTop.gravity = Gravity.START | Gravity.TOP;wParamsTop.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//如果不加,背景會是一片黑色。wParamsTop.format = PixelFormat.RGBA_8888;

type參數上面講過了,這里來看看主要的flag參數。

  • FLAG_NOT_FOCUSABLE:表示Window不需要獲取焦點,也不需要接收各種輸入事件,此標記會同時啟用FLAG_NOT_TOUCH_MODAL,最終事件會直接傳遞給下層具有焦點的Window。
  • FLAG_NOT_TOUCH_MODAL:在此模式下,系統會將當前Window區域以外的點擊事件傳遞給底層的Window,當前Window區域以內的點擊事件則自己處理。
  • FLAG_SHOW_WHEN_LOCKED:開啟此模式可以讓window顯示在鎖屏界面。

Demo

利用ActivityLifecycleCallbacks實現了前后臺的監聽,切換到后臺時隱藏了懸浮窗。感興趣的可以看看這篇文章:ActivityLifecycleCallbacks 判斷APP是否在前臺

上面的logo和下面的viewpager是兩個view ,通過調用兩次addview實現的效果。

源碼下載:Android利用WindowManager實現懸浮窗

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 喀喇沁旗| 青海省| 佳木斯市| 襄樊市| 霍林郭勒市| 黔东| 江津市| 建德市| 米泉市| 雷山县| 常熟市| 织金县| 会宁县| 拉孜县| 韶关市| 武乡县| 漾濞| 南宁市| 铜山县| 同心县| 东兰县| 苏尼特左旗| 望奎县| 荣成市| 威远县| 耿马| 江阴市| 宣城市| 建德市| 乌拉特后旗| 睢宁县| 东乡县| 余姚市| 兰州市| 资兴市| 安宁市| 棋牌| 大洼县| 石门县| 阳朔县| 分宜县|