關(guān)于Window和WindowManager的幾個(gè)知識(shí)點(diǎn)

為了分析Window的工作機(jī)制崎岂,我們需要先了解如何使用WindowManager添加一個(gè)Window篡诽,下面的代碼演示了通過WindowManager添加Window的過程

Button mFloatingButton =new Button(this);
mFloatingButton.setText("button");

int type = WindowManager.LayoutParams.TYPE_TOAST;
int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
WindowManager.LayoutParams  mLayoutParams = new 
WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,type ,flags , PixelFormat.TRANSPARENT);
mLayoutParams.gravity = Gravity.LEFT|Gravity.TOP;
mLayoutParams.x = 100;
mLayoutParams.y = 300;

WindowManager mWindowManager = this.getWindowManager();
mWindowManager.addView(mFloatingButton,mLayoutParams);

上述代碼可以將一個(gè)Button添加到屏幕坐標(biāo)為(100,300)的位置上犁苏。WindowManager.LayoutParams中的flags和type這兩個(gè)參數(shù)比較重要联喘,下面對(duì)其進(jìn)行說明。

Flags參數(shù)表示W(wǎng)indow的屬性驳棱,它有很多選項(xiàng)逗载,通過這些選項(xiàng)可以控制Window的顯示特性哆窿,這里介紹幾個(gè)常用的選項(xiàng):

  • 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ū)域以外的單擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域內(nèi)的單擊事件則自己處理擦秽。這個(gè)標(biāo)記很重要码荔,一般來說都需要開啟此標(biāo)記漩勤。否則其他Window將無法收到單擊事件。
  • FLAG_SHOW_WHEN_LOCKED
    開啟此模式可以讓W(xué)indow顯示在鎖屏的界面上缩搅。

Type參數(shù)表示W(wǎng)indow的類型越败,Window有三種類型,分別是應(yīng)用Window硼瓣、子Window和系統(tǒng)Window究飞。應(yīng)用類Window對(duì)應(yīng)一個(gè)Activity。子Window不能單獨(dú)存在堂鲤,它需要附屬在特定的父Window之中亿傅,比如常見的一些Dialog就是一個(gè)子Window。系統(tǒng)Window是需要聲明權(quán)限在能創(chuàng)建的Window瘟栖,比如Toast和系統(tǒng)狀態(tài)欄這些都是系統(tǒng)Window葵擎。

Window是分層的,每個(gè)Window都有對(duì)應(yīng)的z-ordered慢宗,層級(jí)大的會(huì)覆蓋在層級(jí)小的Window的上面坪蚁,這和HTML中的z-index的概念是完全一致的。在三類Window中镜沽,應(yīng)用Window的層級(jí)范圍是199,子Window的層級(jí)范圍是10001999,系統(tǒng)Window的層級(jí)范圍是2000~2999贱田,這些層級(jí)范圍對(duì)應(yīng)著WindowManager.LayoutParams的type參數(shù)缅茉。如果想要Window位于所有Window的最頂層,那么采用較大的層級(jí)即可男摧。很顯然系統(tǒng)Window的層級(jí)是最大的蔬墩,而且系統(tǒng)層級(jí)有很多值,一般我們可以選用TYPE_SYSTEM_OVERLAY或者TYPE_SYSTEM_ERROR,如果 采用TYPE_SYSTEM_ERROR耗拓,只需要為type參數(shù)指定這個(gè)層級(jí)即可:mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR拇颅;同時(shí)聲明權(quán)限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW“>。
因?yàn)橄到y(tǒng)類型的Window是需要檢查權(quán)限的乔询,如果不在AndroidManifest中使用相應(yīng)的權(quán)限樟插,那么創(chuàng)建Window的時(shí)候就會(huì)報(bào)錯(cuò)。

WindowManager所提供的功能很簡(jiǎn)單竿刁,常用的只要三個(gè)方法 黄锤,即添加View、更新View和刪除View,這三個(gè)方法定義在ViewManager中食拜,而WindowManager繼承了ViewManager鸵熟。

public interface ViewManager{   
   public void addView(View view, ViewGroup.LayoutParams params);    
   public void updateViewLayout(View view, ViewGroup.LayoutParams params);   
   public void removeView(View view);
}

Window是一個(gè)抽象概念,每一個(gè)Window都對(duì)應(yīng)著一個(gè)View和一個(gè)ViewRootImpl,Window和View通過ViewRootImpl來建立聯(lián)系负甸,因此Window并不是實(shí)際存在的流强,它是以View的是形式存在痹届。這點(diǎn)可以從WindowManager的定義中看出來,它提供的三個(gè)接口方法addView打月、updateViewLayout以及removeView都是針對(duì)View的队腐,這說明View才是Window存在的實(shí)體,有視圖的地方就有Window僵控,比如Activity香到、Dialog、Toast报破,除此之外悠就,還有一些依托Window而實(shí)現(xiàn)的視圖,比如PopUpWindow充易、菜單梗脾。在實(shí)際使用中無法直接訪問Window,必須通過WindowManager。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盹靴,一起剝皮案震驚了整個(gè)濱河市炸茧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稿静,老刑警劉巖梭冠,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異改备,居然都是意外死亡控漠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門悬钳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盐捷,“玉大人,你說我怎么就攤上這事默勾〉锒桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵母剥,是天一觀的道長(zhǎng)滞诺。 經(jīng)常有香客問我,道長(zhǎng)媳搪,這世上最難降的妖魔是什么铭段? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮秦爆,結(jié)果婚禮上序愚,老公的妹妹穿的比我還像新娘。我一直安慰自己等限,他們只是感情好爸吮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布芬膝。 她就那樣靜靜地躺著,像睡著了一般形娇。 火紅的嫁衣襯著肌膚如雪锰霜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天桐早,我揣著相機(jī)與錄音癣缅,去河邊找鬼。 笑死哄酝,一個(gè)胖子當(dāng)著我的面吹牛友存,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陶衅,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屡立,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了搀军?” 一聲冷哼從身側(cè)響起膨俐,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罩句,沒想到半個(gè)月后焚刺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡门烂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年檩坚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诅福。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拖叙,靈堂內(nèi)的尸體忽然破棺而出氓润,到底是詐尸還是另有隱情,我是刑警寧澤薯鳍,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布咖气,位于F島的核電站,受9級(jí)特大地震影響挖滤,放射性物質(zhì)發(fā)生泄漏崩溪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一斩松、第九天 我趴在偏房一處隱蔽的房頂上張望伶唯。 院中可真熱鬧,春花似錦惧盹、人聲如沸乳幸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粹断。三九已至符欠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓶埋,已是汗流浹背希柿。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留养筒,地道東北人曾撤。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闽颇,于是被迫代替她去往敵國(guó)和親盾戴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容