本文實際上就是翻譯了官方文檔的flag部分
flags變量設(shè)置的值的各種意義
//---------------1-----------------------------------
FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
//Constant Value: 1 (0x00000001)
只要這個window對用戶是可見的,則允許在屏幕開啟的時候鎖定屏幕
這個flag可以單獨的使用,也可以配合FLAG_KEEP_SCREEN_ON和(或者) FLAG_SHOW_WHEN_LOCKED使用
//----------------------------------------------------
//---------------2-----------------------------------
FLAG_DIM_BEHIND
//Constant Value: 2 (0x00000002)
所有在這個window之后的會變暗,
使用dimAmount屬性來控制變暗的程度(1.0不透明,0.0完全透明)
//----------------------------------------------------
//---------------3-----------------------------------
FLAG_NOT_FOCUSABLE
//Constant Value: 8 (0x00000008)
設(shè)置之后window永遠(yuǎn)不會獲取焦點,所以用戶不能給此window發(fā)送點擊事件
焦點會傳遞給在其下面的可獲取焦點的window
這個flag同時會啟用 FLAG_NOT_TOUCH_MODAL flag , 不管你有沒有手動設(shè)置
設(shè)置這個flag同時表明了這個window不會和軟鍵盤交互,
(這句話的翻譯我不知道對不對)所以window會獨立于激活的軟鍵盤之上(這句話的意思就是window會在Z軸上置于輸入法之上,所以window可以全屏使用來覆蓋住輸入法,你可以使用 FLAG_ALT_FOCUSABLE_IM 來修改這個行為)
//----------------------------------------------------
//---------------4-----------------------------------
FLAG_NOT_TOUCHABLE
//Constant Value: 16 (0x00000010)
這個window永遠(yuǎn)無法獲取點擊事件
//----------------------------------------------------
//---------------5-----------------------------------
FLAG_NOT_TOUCH_MODAL
Constant Value: 32 (0x00000020)
即使這個window是可獲取焦點的,
也允許window之外點擊事件傳遞給其他在其之后的window
如果不設(shè)置這個值,則window消費掉所有點擊事件,不管這些點擊事件是不是在window的范圍之內(nèi)
//如果要做懸浮框,我想這個flag肯定得設(shè)置,但api>=23就別想了
這個flag簡而言之就是說,當(dāng)前window區(qū)域以外的點擊事件傳遞給下層window,當(dāng)前window區(qū)域以內(nèi)的點擊事件自己處理
//----------------------------------------------------
//---------------6-----------------------------------
FLAG_TOUCHABLE_WHEN_WAKING
//Constant Value: 64 (0x00000040)
//This constant was deprecated in API level 20.等于說沒什么吊用了
//This flag has no effect.
當(dāng)設(shè)置了這個值,則device休眠的時候,當(dāng)觸摸屏被點擊,window會收到首次點擊事件,通常當(dāng)用戶看不見東西時,首次點擊事件會被系統(tǒng)消費
//----------------------------------------------------
//---------------7-----------------------------------
FLAG_KEEP_SCREEN_ON
//Constant Value: 128 (0x00000080)
當(dāng)這個window對用戶是可見狀態(tài),則保持設(shè)備屏幕不關(guān)閉且不變暗
//----------------------------------------------------
//---------------8-----------------------------------
FLAG_LAYOUT_IN_SCREEN
//Constant Value: 256 (0x00000100)
將window放置在整個屏幕之內(nèi),無視其他的裝飾(比如狀態(tài)欄)
window要在考慮到屏幕的其他裝飾來定位其中的內(nèi)容
這個flag通常使用Window類的setFlags(int, int)方法來設(shè)置
//----------------------------------------------------
//---------------9-----------------------------------
FLAG_LAYOUT_NO_LIMITS
//Constant Value: 512 (0x00000200)
允許window擴展值屏幕之外
//----------------------------------------------------
//---------------10-----------------------------------
FLAG_FULLSCREEN
//Constant Value: 1024 (0x00000400)
當(dāng)這個window顯示的時候,隱藏所有的裝飾物(比如狀態(tài)欄)
這個flag允許window使用整個屏幕區(qū)域
當(dāng)設(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.
//----------------------------------------------------
//---------------11-----------------------------------
FLAG_FORCE_NOT_FULLSCREEN
//Constant Value: 2048 (0x00000800)
覆蓋FLAG_FULLSCREEN效果,并強制顯示屏幕上的一些裝飾(如狀態(tài)欄)
//----------------------------------------------------
//---------------12-----------------------------------
FLAG_SECURE
//Constant Value: 8192 (0x00002000)
把這個window中的內(nèi)容看作需要保護的內(nèi)容,
防止被截屏,或防止內(nèi)容顯示在一些不安全的屏幕上
see https://developer.android.google.cn/reference/android/view/Display.html#FLAG_SECURE for more details about secure surfaces and secure displays
//----------------------------------------------------
//---------------13-----------------------------------
FLAG_SCALED
Constant Value: 16384 (0x00004000)
抱歉沒看懂,你們還是看原文把
//Window flag: a special mode where the layout parameters are used to perform scaling of the surface when it is composited to the screen.
//----------------------------------------------------
//---------------14-----------------------------------
FLAG_IGNORE_CHEEK_PRESSES
//Constant Value: 32768 (0x00008000)
這個flag一般用于,當(dāng)用戶把臉貼在屏幕上,它會過濾不需要的點擊事件
當(dāng)檢測到一個事件流,這個程序會直接接收到一個CANCEL事件.
這樣程序可以正確的處理這種情況,
直到手指離開屏幕
//----------------------------------------------------
//---------------15-----------------------------------
FLAG_LAYOUT_INSET_DECOR
//Constant Value: 65536 (0x00010000)
這個flag只能配合 FLAG_LAYOUT_IN_SCREEN 一起使用.
當(dāng)在屏幕中請求layout時,window可能在一些裝飾物(如狀態(tài)欄)之上或者之后
當(dāng)使用這個flag時,window manager會報告插入window的矩形大小,
來確保你的內(nèi)容不會被裝飾物(如狀態(tài)欄)掩蓋.
這個flag一般用Window類的 setFlags(int, int)方法來設(shè)置
//----------------------------------------------------
//---------------16-----------------------------------
FLAG_ALT_FOCUSABLE_IM
Constant Value: 131072 (0x00020000)
轉(zhuǎn)變 FLAG_NOT_FOCUSABLE 設(shè)置的狀態(tài),關(guān)于這個window是怎么和當(dāng)前的輸入法交互
如果設(shè)置了FLAG_NOT_FOCUSABLE且FLAG_ALT_FOCUSABLE_IM也設(shè)置了,那么當(dāng)這個window和input method交互的時候會被放置在input method后面或者旁邊.
如果FLAG_NOT_FOCUSABLE沒有設(shè)置而設(shè)置了FLAG_ALT_FOCUSABLE_IM,那么window不需要和input method交互,可以放置在輸入法上面
//這個實際上是我強行理解的,翻譯得可能不準(zhǔn)確,如果要使用的話,還是要自己測試下
//----------------------------------------------------
//---------------17-----------------------------------
FLAG_WATCH_OUTSIDE_TOUCH
//Constant Value: 262144 (0x00040000)
如果你已經(jīng)設(shè)置了FLAG_NOT_TOUCH_MODAL,那么你可以設(shè)置FLAG_WATCH_OUTSIDE_TOUCH這個flag,
這樣一個點擊事件如果發(fā)生在你的window之外的范圍,你就會接收到一個特殊的MotionEvent,MotionEvent.ACTION_OUTSIDE
注意,你只會接收到點擊事件的第一下,而之后的DOWN/MOVE/UP等手勢全都不會接收到
//----------------------------------------------------
//---------------18-----------------------------------
FLAG_SHOW_WHEN_LOCKED
//Constant Value: 524288 (0x00080000)
一個特殊的flag,使得window可以在鎖屏狀態(tài)下顯示
這個flag會使得window比keyguard或其他鎖屏界面具有更高的層級
可以配合FLAG_KEEP_SCREEN_ON使用,點亮屏幕,在顯示keyguard window之前顯示你的window.
可以配合FLAG_DISMISS_KEYGUARD使用來自動解鎖沒密碼的keyguards
這個flag只能應(yīng)用在最頂層的全屏window上
用人話說就是可以讓window顯示在鎖屏界面上
//----------------------------------------------------
//---------------19-----------------------------------
FLAG_SHOW_WALLPAPER //實測沒吊用,也有可能我理解得不對
//Constant Value: 1048576 (0x00100000)
請求系統(tǒng)將壁紙顯示在window后面,這個window表面需要是透明的才能顯示出墻紙.
這個flag只能保證如果你的window有透明的區(qū)域,墻紙會顯示在那
這個flag也可以在theme中使用 windowShowWallpaper 這個屬性來設(shè)置.
有些主題已經(jīng)設(shè)置好: Theme_Wallpaper,
Theme_Wallpaper_NoTitleBar,
Theme_Wallpaper_NoTitleBar_Fullscreen,
Theme_Holo_Wallpaper, Theme_Holo_Wallpaper_NoTitleBar,
Theme_DeviceDefault_Wallpaper,
Theme_DeviceDefault_Wallpaper_NoTitleBar.
//----------------------------------------------------
//---------------20-----------------------------------
FLAG_TURN_SCREEN_ON
//Constant Value: 2097152 (0x00200000)
當(dāng)window被添加或者顯示,系統(tǒng)會點亮屏幕,就好像用戶喚醒屏幕一樣
//----------------------------------------------------
//---------------21-----------------------------------
FLAG_DISMISS_KEYGUARD
//Constant Value: 4194304 (0x00400000)
當(dāng)使用的是無密碼的鎖屏界面,顯示此window會使鎖屏界面被自動解鎖,其他廢話就不翻譯了
//----------------------------------------------------
//---------------22-----------------------------------
FLAG_SPLIT_TOUCH
//Constant Value: 8388608 (0x00800000)
當(dāng)window設(shè)置這個flag,window會接收來自window邊界之外發(fā)送給其他window的點擊事件,支持多點觸控.
當(dāng)這個flag沒有設(shè)置的時候,第一下點擊則決定了哪個window會接收整個點擊事件,直到手指拿開.
當(dāng)設(shè)置了這個flag,這每一個點擊事件(不一定是第一個)都決定了那個window來接收剩下的點擊事件,直到手指拿開.點擊事件會被分開傳遞給多個window.
貌似是關(guān)于多點觸控的,我TM自己也沒看明白
原文:Window flag: when set the window will accept for touch events outside of its bounds to be sent to other windows that also support split touch. When this flag is not set, the first pointer that goes down determines the window to which all subsequent touches go until all pointers go up. When this flag is set, each pointer (not necessarily the first) that goes down determines the window to which all subsequent touches of that pointer will go until that pointer goes up thereby enabling touches with multiple pointers to be split across multiple windows.
//----------------------------------------------------
//---------------23-----------------------------------
FLAG_HARDWARE_ACCELERATED
//Constant Value: 16777216 (0x01000000)
表示這個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之前來配置
當(dāng)你在manifest中設(shè)置了硬件加速后,這個flag不能用來取消硬件加速
當(dāng)在Activity標(biāo)簽或者application標(biāo)簽中設(shè)置了 hardwareAccelerated = true屬性這個flag就自動設(shè)置上了
//----------------------------------------------------
//---------------24-----------------------------------
FLAG_LOCAL_FOCUS_MODE
//Constant Value: 268435456 (0x10000000)
設(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)
//----------------------------------------------------
//---------------25-----------------------------------
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
//Constant Value: -2147483648 (0x80000000)
這個flag表示window負(fù)責(zé)繪制狀態(tài)欄的北京
當(dāng)設(shè)置了這個flag,系統(tǒng)狀態(tài)欄會變透明,同時這個相應(yīng)的區(qū)域會被填滿 getStatusBarColor() and getNavigationBarColor()的顏色,
//----------------------------------------------------