最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android利用WindowManager實現(xiàn)懸浮窗

 更新時間:2018年07月20日 17:16:47   作者:xiaozhang1993  
這篇文章主要為大家詳細(xì)介紹了Android利用WindowManager實現(xiàn)懸浮窗效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

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

效果

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

Window

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

Window整體分三種類型:應(yīng)用Window、子Window、系統(tǒng)Window。

  • 應(yīng)用Window:對應(yīng)一個Activity
  • 子Window:不能單獨存在,它需要附屬在特定的父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不需要獲取焦點,也不需要接收各種輸入事件,此標(biāo)記會同時啟用FLAG_NOT_TOUCH_MODAL,最終事件會直接傳遞給下層具有焦點的Window。
  • FLAG_NOT_TOUCH_MODAL:在此模式下,系統(tǒng)會將當(dāng)前Window區(qū)域以外的點擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域以內(nèi)的點擊事件則自己處理。
  • FLAG_SHOW_WHEN_LOCKED:開啟此模式可以讓window顯示在鎖屏界面。

Demo

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

上面的logo和下面的viewpager是兩個view ,通過調(diào)用兩次addview實現(xiàn)的效果。

源碼下載:Android利用WindowManager實現(xiàn)懸浮窗

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實現(xiàn)銀行卡、手機(jī)號帶空格格式

    Android實現(xiàn)銀行卡、手機(jī)號帶空格格式

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)銀行卡、手機(jī)號帶空格的格式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Android Doze模式下Alarm定時任務(wù)實現(xiàn)流程詳解

    Android Doze模式下Alarm定時任務(wù)實現(xiàn)流程詳解

    這篇文章主要介紹了Android Doze模式下Alarm定時任務(wù)實現(xiàn),Android的定時任務(wù)有兩種,一種是JavaAPI提供的Timer類,另一種就是使用Android的Alarm機(jī)制
    2022-11-11
  • Android實現(xiàn)簡單的自定義ViewGroup流式布局

    Android實現(xiàn)簡單的自定義ViewGroup流式布局

    本文我們將一起復(fù)習(xí)一下ViewGroup的測量布局方式。然后會以入門級的 FlowLayout 為例,來看看流式布局是如何測量與布局的,感興趣的可以了解一下
    2022-12-12
  • Android使用fragment實現(xiàn)左側(cè)導(dǎo)航

    Android使用fragment實現(xiàn)左側(cè)導(dǎo)航

    這篇文章主要為大家詳細(xì)介紹了Android使用fragment實現(xiàn)左側(cè)導(dǎo)航,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Android開發(fā)之DialogFragment用法實例總結(jié)

    Android開發(fā)之DialogFragment用法實例總結(jié)

    這篇文章主要介紹了Android開發(fā)之DialogFragment用法,結(jié)合實例形式總結(jié)分析了Android使用DialogFragment代替Dialog功能的相關(guān)使用技巧與注意事項,需要的朋友可以參考下
    2017-11-11
  • Android利用GridView實現(xiàn)單選功能

    Android利用GridView實現(xiàn)單選功能

    這篇文章主要為大家詳細(xì)介紹了Android利用GridView實現(xiàn)單選功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android自定義View實現(xiàn)粉碎的面具效果

    Android自定義View實現(xiàn)粉碎的面具效果

    這篇文章主要給大家介紹了關(guān)于Android自定義View實現(xiàn)粉碎的面具效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Android編程實現(xiàn)二維碼的生成與解析

    Android編程實現(xiàn)二維碼的生成與解析

    這篇文章主要介紹了Android編程實現(xiàn)二維碼的生成與解析方法,結(jié)合實例分析了Android二維碼的生成與讀取二維碼的相關(guān)技巧,并提供了二維碼jar包供讀者下載,需要的朋友可以參考下
    2015-11-11
  • Android超詳細(xì)講解彈出多選框的實現(xiàn)

    Android超詳細(xì)講解彈出多選框的實現(xiàn)

    這篇文章主要介紹了在Android開發(fā)中如何實現(xiàn)彈出多選框的功能,多選框是很常見的操作控件,感興趣的朋友都來一起看看吧
    2022-03-03
  • Android中實現(xiàn)GPS定位的簡單例子

    Android中實現(xiàn)GPS定位的簡單例子

    這篇文章主要介紹了Android中實現(xiàn)GPS定位的簡單例子,例子邏輯清晰,但相對簡單了些,需要的朋友可以參考下
    2014-07-07

最新評論

云南省| 梁平县| 穆棱市| 荥阳市| 安仁县| 永登县| 甘肃省| 都匀市| 遂川县| 灵石县| 马关县| 新化县| 山东省| 临颍县| 开平市| 远安县| 万全县| 璧山县| 紫金县| 江源县| 新津县| 宿松县| 荥经县| 盐城市| 昔阳县| 昌乐县| 阿拉善左旗| 梨树县| 宜宾县| 徐水县| 达孜县| 博野县| 浦东新区| 黎城县| 阿克苏市| 河曲县| 汉中市| 唐山市| 中山市| 仲巴县| 特克斯县|