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
設定之後window永遠不會獲取焦點,所以使用者不能給此window傳送點選事件焦點會傳遞給在其下面的可獲取焦點的window這個flag同時會啟用 FLAG_NOT_TOUCH_MODAL flag , 不管你有沒有手動設定設定這個flag同時表明了這個window不會和軟鍵盤互動,(這句話的翻譯我不知道對不對)所以window會獨立於啟用的軟鍵盤之上(這句話的意思就是window會在Z軸上置於輸入法之上,所以window可以全屏使用來覆蓋住輸入法,你可以使用FLAG_ALT_FOCUSABLE_IM 來修改這個行為)
FLAG_NOT_TOUCHABLE
這個window永遠無法獲取點選事件
FLAG_NOT_TOUCH_MODAL
即使這個window是可獲取焦點的,也允許window之外點選事件傳遞給其他在其之後的indow
如果不設定這個值,則window消費掉所有點選事件,不管這些點選事件是不是在window的範圍之內。//如果要做懸浮框,我想這個flag肯定得設定,但api>=23就別想了。這個flag簡而言之就是說,當前window區域以外的點選事件傳遞給下層window,當前window區域以內的點選事件自己處理
FLAG_TOUCHABLE_WHEN_WAKING
當設定了這個值,則device休眠的時候,當觸控式螢幕被點選,window會收到首次點選事件,通常當用戶看不見東西時,首次點選事件會被系統消費
FLAG_KEEP_SCREEN_ON
當這個window對使用者是可見狀態,則保持裝置螢幕不關閉且不變暗
FLAG_LAYOUT_IN_SCREEN
將window放置在整個螢幕之內,無視其他的裝飾(比如狀態列)window要在考慮到螢幕的其他裝飾來定位其中的內容這個flag通常使用Window類的setFlags(int, int)方法來設定
FLAG_LAYOUT_NO_LIMITS
允許window擴充套件值螢幕之外
FLAG_FULLSCREEN
當這個window顯示的時候,隱藏所有的裝飾物(比如狀態列)這個flag允許window使用整個螢幕區域當設定這個flag的window處於頂層的時候,狀態列會被隱藏全屏的時候會忽略 softInputMode 變數設定的SOFT_INPUT_ADJUST_RESIZE 效果,螢幕會不保持全屏且不會resize這個flag可以在主題屬性(theme)中來控制通過 windowFullscreen 屬性來控制
在一些常用的全屏主題中這個屬性已經被設定好了
常用全屏主題: 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效果,並強制顯示螢幕上的一些裝飾(如狀態列)
FLAG_SECURE
把這個window中的內容看作需要保護的內容,防止被截圖,或防止內容顯示在一些不安全的螢幕上
FLAG_IGNORE_CHEEK_PRESSES
這個flag一般用於,當用戶把臉貼在螢幕上,它會過濾不需要的點選事件,當檢測到一個事件流,這個程式會直接接收到一個CANCEL事件.這樣程式可以正確的處理這種情況,直到手指離開螢幕
FLAG_LAYOUT_INSET_DECOR
這個flag只能配合 FLAG_LAYOUT_IN_SCREEN 一起使用.當在螢幕中請求layout時,window可能在一些裝飾物(如狀態列)之上或者之後當使用這個flag時,window manager會報告插入window的矩形大小,來確保你的內容不會被裝飾物(如狀態列)掩蓋.這個flag一般用Window類的 setFlags(int, int)方法來設定
FLAG_ALT_FOCUSABLE_IM
轉變 FLAG_NOT_FOCUSABLE 設定的狀態,關於這個window是怎麼和當前的輸入法互動
如果設定了FLAG_NOT_FOCUSABLE且FLAG_ALT_FOCUSABLE_IM也設定了,那麼當這個window和input method互動的時候會被放置在input method後面或者旁邊.如果FLAG_NOT_FOCUSABLE沒有設定而設定了FLAG_ALT_FOCUSABLE_IM,那麼window不需要和input method互動,可以放置在輸入法上面
FLAG_WATCH_OUTSIDE_TOUCH
如果你已經設定了FLAG_NOT_TOUCH_MODAL,那麼你可以設定FLAG_WATCH_OUTSIDE_TOUCH這個flag,這樣一個點選事件如果發生在你的window之外的範圍,你就會接收到一個特殊的MotionEvent,MotionEvent.ACTION_OUTSIDE注意,你只會接收到點選事件的第一下,而之後的DOWN/MOVE/UP等手勢全都不會接收到
FLAG_SHOW_WHEN_LOCKED
一個特殊的flag,使得window可以在鎖屏狀態下顯示,這個flag會使得window比keyguard或其他鎖屏介面具有更高的層級可以配合FLAG_KEEP_SCREEN_ON使用,點亮螢幕,在顯示keyguard window之前顯示你的window.可以配合FLAG_DISMISS_KEYGUARD使用來自動解鎖沒密碼的keyguards這個flag只能應用在最頂層的全屏window上,用人話說就是可以讓window顯示在鎖屏介面上
FLAG_TURN_SCREEN_ON
當window被新增或者顯示,系統會點亮螢幕,就好像使用者喚醒螢幕一樣
FLAG_DISMISS_KEYGUARD
當使用的是無密碼的鎖屏介面,顯示此window會使鎖屏介面被自動解鎖,其他廢話就不翻譯了
FLAG_SPLIT_TOUCH
當window設定這個flag,window會接收來自window邊界之外發送給其他window的點選事件,支援多點觸控.當這個flag沒有設定的時候,第一下點選則決定了哪個window會接收整個點選事件,直到手指拿開.當設定了這個flag,這每一個點選事件(不一定是第一個)都決定了那個window來接收剩下的點選事件,直到手指拿開.點選事件會被分開傳遞給多個window.貌似是關於多點觸控的
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中設定了硬體加速後,這個flag不能用來取消硬體加速。當在Activity標籤或者application標籤中設定了 hardwareAccelerated = true屬性這個flag就自動設定上了
FLAG_LOCAL_FOCUS_MODE
設定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負責繪製狀態列的北京當設定了這個flag,系統狀態列會變透明,同時這個相應的區域會被填滿 getStatusBarColor() and getNavigationBarColor()的顏色