WindowManager.LayoutParams的各種flag含義


FLAG_ALLOW_LOCK_WHILE_SCREEN_ON

只要這個window對用戶是可見的,則允許在屏幕開啟的時候鎖定屏幕這個flag可以單獨的使用,也可以配合FLAG_KEEP_SCREEN_ON和(或者) FLAG_SHOW_WHEN_LOCKED使用

FLAG_DIM_BEHIND

所有在這個window之后的會變暗,使用dimAmount屬性來控制變暗的程度(1.0不透明,0.0完全透明)

FLAG_NOT_FOCUSABLE

設(shè)置之后window永遠不會獲取焦點,所以用戶不能給此window發(fā)送點擊事件焦點會傳遞給在其下面的可獲取焦點的window這個flag同時會啟用 FLAG_NOT_TOUCH_MODAL flag , 不管你有沒有手動設(shè)置設(shè)置這個flag同時表明了這個window不會和軟鍵盤交互,(這句話的翻譯我不知道對不對)所以window會獨立于激活的軟鍵盤之上(這句話的意思就是window會在Z軸上置于輸入法之上,所以window可以全屏使用來覆蓋住輸入法,你可以使用FLAG_ALT_FOCUSABLE_IM 來修改這個行為)

FLAG_NOT_TOUCHABLE

這個window永遠無法獲取點擊事件

FLAG_NOT_TOUCH_MODAL

即使這個window是可獲取焦點的,也允許window之外點擊事件傳遞給其他在其之后的indow

如果不設(shè)置這個值,則window消費掉所有點擊事件,不管這些點擊事件是不是在window的范圍之內(nèi)。//如果要做懸浮框,我想這個flag肯定得設(shè)置,但api>=23就別想了。這個flag簡而言之就是說,當前window區(qū)域以外的點擊事件傳遞給下層window,當前window區(qū)域以內(nèi)的點擊事件自己處理

FLAG_TOUCHABLE_WHEN_WAKING

當設(shè)置了這個值,則device休眠的時候,當觸摸屏被點擊,window會收到首次點擊事件,通常當用戶看不見東西時,首次點擊事件會被系統(tǒng)消費

FLAG_KEEP_SCREEN_ON

當這個window對用戶是可見狀態(tài),則保持設(shè)備屏幕不關(guān)閉且不變暗

FLAG_LAYOUT_IN_SCREEN

將window放置在整個屏幕之內(nèi),無視其他的裝飾(比如狀態(tài)欄)window要在考慮到屏幕的其他裝飾來定位其中的內(nèi)容這個flag通常使用Window類的setFlags(int, int)方法來設(shè)置

FLAG_LAYOUT_NO_LIMITS

允許window擴展值屏幕之外

FLAG_FULLSCREEN

當這個window顯示的時候,隱藏所有的裝飾物(比如狀態(tài)欄)這個flag允許window使用整個屏幕區(qū)域當設(shè)置這個flag的window處于頂層的時候,狀態(tài)欄會被隱藏全屏的時候會忽略 softInputMode 變量設(shè)置的SOFT_INPUT_ADJUST_RESIZE 效果,屏幕會不保持全屏且不會resize這個flag可以在主題屬性(theme)中來控制通過 windowFullscreen 屬性來控制

在一些常用的全屏主題中這個屬性已經(jīng)被設(shè)置好了

常用全屏主題: Theme_NoTitleBar_Fullscreen,

Theme_Black_NoTitleBar_Fullscreen,

Theme_Light_NoTitleBar_Fullscreen,

Theme_Holo_NoActionBar_Fullscreen,

Theme_Holo_Light_NoActionBar_Fullscreen,

Theme_DeviceDefault_NoActionBar_Fullscreen,

Theme_DeviceDefault_Light_NoActionBar_Fullscreen.

FLAG_FORCE_NOT_FULLSCREEN

覆蓋FLAG_FULLSCREEN效果,并強制顯示屏幕上的一些裝飾(如狀態(tài)欄)

FLAG_SECURE

把這個window中的內(nèi)容看作需要保護的內(nèi)容,防止被截屏,或防止內(nèi)容顯示在一些不安全的屏幕上

FLAG_IGNORE_CHEEK_PRESSES

這個flag一般用于,當用戶把臉貼在屏幕上,它會過濾不需要的點擊事件,當檢測到一個事件流,這個程序會直接接收到一個CANCEL事件.這樣程序可以正確的處理這種情況,直到手指離開屏幕

FLAG_LAYOUT_INSET_DECOR

這個flag只能配合 FLAG_LAYOUT_IN_SCREEN 一起使用.當在屏幕中請求layout時,window可能在一些裝飾物(如狀態(tài)欄)之上或者之后當使用這個flag時,window manager會報告插入window的矩形大小,來確保你的內(nèi)容不會被裝飾物(如狀態(tài)欄)掩蓋.這個flag一般用Window類的 setFlags(int, int)方法來設(shè)置

FLAG_ALT_FOCUSABLE_IM

轉(zhuǎn)變 FLAG_NOT_FOCUSABLE 設(shè)置的狀態(tài),關(guān)于這個window是怎么和當前的輸入法交互

如果設(shè)置了FLAG_NOT_FOCUSABLE且FLAG_ALT_FOCUSABLE_IM也設(shè)置了,那么當這個window和input method交互的時候會被放置在input method后面或者旁邊.如果FLAG_NOT_FOCUSABLE沒有設(shè)置而設(shè)置了FLAG_ALT_FOCUSABLE_IM,那么window不需要和input method交互,可以放置在輸入法上面

FLAG_WATCH_OUTSIDE_TOUCH

如果你已經(jīng)設(shè)置了FLAG_NOT_TOUCH_MODAL,那么你可以設(shè)置FLAG_WATCH_OUTSIDE_TOUCH這個flag,這樣一個點擊事件如果發(fā)生在你的window之外的范圍,你就會接收到一個特殊的MotionEvent,MotionEvent.ACTION_OUTSIDE注意,你只會接收到點擊事件的第一下,而之后的DOWN/MOVE/UP等手勢全都不會接收到

FLAG_SHOW_WHEN_LOCKED

一個特殊的flag,使得window可以在鎖屏狀態(tài)下顯示,這個flag會使得window比keyguard或其他鎖屏界面具有更高的層級可以配合FLAG_KEEP_SCREEN_ON使用,點亮屏幕,在顯示keyguard window之前顯示你的window.可以配合FLAG_DISMISS_KEYGUARD使用來自動解鎖沒密碼的keyguards這個flag只能應用在最頂層的全屏window上,用人話說就是可以讓window顯示在鎖屏界面上

FLAG_TURN_SCREEN_ON

當window被添加或者顯示,系統(tǒng)會點亮屏幕,就好像用戶喚醒屏幕一樣

FLAG_DISMISS_KEYGUARD

當使用的是無密碼的鎖屏界面,顯示此window會使鎖屏界面被自動解鎖,其他廢話就不翻譯了

FLAG_SPLIT_TOUCH

當window設(shè)置這個flag,window會接收來自window邊界之外發(fā)送給其他window的點擊事件,支持多點觸控.當這個flag沒有設(shè)置的時候,第一下點擊則決定了哪個window會接收整個點擊事件,直到手指拿開.當設(shè)置了這個flag,這每一個點擊事件(不一定是第一個)都決定了那個window來接收剩下的點擊事件,直到手指拿開.點擊事件會被分開傳遞給多個window.貌似是關(guān)于多點觸控的

FLAG_HARDWARE_ACCELERATED

表示這個window是否啟動硬件加速,請求硬件加速但不能保證硬件加速生效。如果僅是用來啟動硬件加速,可以在代碼中控制,使用下面的代碼給指定window啟動硬件加速:

Window w = activity.getWindow(); // in Activity's onCreate() for instance

w.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

有一件很重要的事需要記住,這個flag需要在Activity和dialog添加view之前來配置。當你在manifest中設(shè)置了硬件加速后,這個flag不能用來取消硬件加速。當在Activity標簽或者application標簽中設(shè)置了 hardwareAccelerated = true屬性這個flag就自動設(shè)置上了

FLAG_LOCAL_FOCUS_MODE

設(shè)置flag啟用local focus模式(我也不知道local focus mode是什么),在這種模式下window可以不依賴windowmanager獨立的控制焦點,使用window的 setLocalFocus(boolean, boolean) 方法即可通常在這種模式下,window不會通過windowmanager獲取到touch/key event,但是會通過local injection(我不知道這是什么)得到event,by using injectInputEvent(InputEvent) 方法(貌似是手動的強行向一個window插入一個input event)

FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

這個flag表示window負責繪制狀態(tài)欄的北京當設(shè)置了這個flag,系統(tǒng)狀態(tài)欄會變透明,同時這個相應的區(qū)域會被填滿 getStatusBarColor() and getNavigationBarColor()的顏色

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容