真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

前言

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出湘潭縣免費(fèi)做網(wǎng)站回饋大家。

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

效果

gif圖看著有點(diǎn)兒卡,其實(shí)實(shí)際上還是很流暢的。

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

Window

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

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

  • 應(yīng)用Window:對(duì)應(yīng)一個(gè)Activity
  • 子Window:不能單獨(dú)存在,它需要附屬在特定的父Window中,比如常見(jiàn)的一些Dialog就是子Window。
  • 系統(tǒng)Window:需要聲明權(quán)限才能用,Toast就是一種系統(tǒng)Window。

每種Window類型又能分多個(gè)層級(jí):

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

層級(jí)高的Window會(huì)覆蓋層級(jí)低的Window,跟Android5.0引入的Z軸類似。

權(quán)限

Android6.0以上,如果要用系統(tǒng)Window,我們需要申請(qǐng)懸浮窗權(quán)限。畢竟WindowManager.LayoutParams.TYPE_TOAST權(quán)限限制太多了。

Manifests:

判斷是否有懸浮窗權(quán)限:

Settings.canDrawOverlays(this)

申請(qǐng)權(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)出來(lái),必須要通過(guò)Window,但是我們無(wú)法直接操作Window,需要用到WindowManager。

WindowManager 獲取對(duì)象:

mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

WindowManager 繼承了 ViewManager,操作View總共只有這三個(gè)方法:

public interface ViewManager
{
  /**
   * Assign the passed LayoutParams to the passed View and add the view to the window.
   * 

Throws {@link android.view.WindowManager.BadTokenException} for certain programming * errors, such as adding a second view to a window without removing the first view. *

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時(shí),需要用到LayoutParams。
這里來(lái)舉個(gè)栗子:

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;
//如果不加,背景會(huì)是一片黑色。
wParamsTop.format = PixelFormat.RGBA_8888;

type參數(shù)上面講過(guò)了,這里來(lái)看看主要的flag參數(shù)。

  • FLAG_NOT_FOCUSABLE:表示W(wǎng)indow不需要獲取焦點(diǎn),也不需要接收各種輸入事件,此標(biāo)記會(huì)同時(shí)啟用FLAG_NOT_TOUCH_MODAL,最終事件會(huì)直接傳遞給下層具有焦點(diǎn)的Window。
  • FLAG_NOT_TOUCH_MODAL:在此模式下,系統(tǒng)會(huì)將當(dāng)前Window區(qū)域以外的點(diǎn)擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域以內(nèi)的點(diǎn)擊事件則自己處理。
  • FLAG_SHOW_WHEN_LOCKED:開(kāi)啟此模式可以讓window顯示在鎖屏界面。

Demo

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


分享名稱:Android利用WindowManager實(shí)現(xiàn)懸浮窗
標(biāo)題網(wǎng)址:http://weahome.cn/article/iecgcd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部