WindowManager.LayoutParams的各种flag含义

本文实际上就是翻译了官方文档的flag部分

flags变量设置的值的各种意义


//---------------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)
设置之后window永远不会获取焦点,所以用户不能给此window发送点击事件
焦点会传递给在其下面的可获取焦点的window
这个flag同时会启用 FLAG_NOT_TOUCH_MODAL flag , 不管你有没有手动设置
设置这个flag同时表明了这个window不会和软键盘交互,
(这句话的翻译我不知道对不对)所以window会独立于激活的软键盘之上(这句话的意思就是window会在Z轴上置于输入法之上,所以window可以全屏使用来覆盖住输入法,你可以使用 FLAG_ALT_FOCUSABLE_IM 来修改这个行为)
//----------------------------------------------------

//---------------4-----------------------------------
FLAG_NOT_TOUCHABLE
//Constant Value: 16 (0x00000010)
这个window永远无法获取点击事件
//----------------------------------------------------


//---------------5-----------------------------------
FLAG_NOT_TOUCH_MODAL
Constant Value: 32 (0x00000020)
即使这个window是可获取焦点的,
也允许window之外点击事件传递给其他在其之后的window
如果不设置这个值,则window消费掉所有点击事件,不管这些点击事件是不是在window的范围之内
//如果要做悬浮框,我想这个flag肯定得设置,但api>=23就别想了

这个flag简而言之就是说,当前window区域以外的点击事件传递给下层window,当前window区域以内的点击事件自己处理

//----------------------------------------------------


//---------------6-----------------------------------
FLAG_TOUCHABLE_WHEN_WAKING
//Constant Value: 64 (0x00000040)
//This constant was deprecated in API level 20.等于说没什么吊用了
//This flag has no effect.
当设置了这个值,则device休眠的时候,当触摸屏被点击,window会收到首次点击事件,通常当用户看不见东西时,首次点击事件会被系统消费
//----------------------------------------------------

//---------------7-----------------------------------
FLAG_KEEP_SCREEN_ON
//Constant Value: 128 (0x00000080)
当这个window对用户是可见状态,则保持设备屏幕不关闭且不变暗
//----------------------------------------------------

//---------------8-----------------------------------
FLAG_LAYOUT_IN_SCREEN
//Constant Value: 256 (0x00000100)
将window放置在整个屏幕之内,无视其他的装饰(比如状态栏)
window要在考虑到屏幕的其他装饰来定位其中的内容
这个flag通常使用Window类的setFlags(int, int)方法来设置
//----------------------------------------------------

//---------------9-----------------------------------
FLAG_LAYOUT_NO_LIMITS
//Constant Value: 512 (0x00000200)
允许window扩展值屏幕之外
//----------------------------------------------------


//---------------10-----------------------------------
FLAG_FULLSCREEN
//Constant Value: 1024 (0x00000400)
当这个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.
//----------------------------------------------------

//---------------11-----------------------------------
FLAG_FORCE_NOT_FULLSCREEN
//Constant Value: 2048 (0x00000800)
覆盖FLAG_FULLSCREEN效果,并强制显示屏幕上的一些装饰(如状态栏)
//----------------------------------------------------

//---------------12-----------------------------------
FLAG_SECURE
//Constant Value: 8192 (0x00002000)
把这个window中的内容看作需要保护的内容,
防止被截屏,或防止内容显示在一些不安全的屏幕上
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一般用于,当用户把脸贴在屏幕上,它会过滤不需要的点击事件
当检测到一个事件流,这个程序会直接接收到一个CANCEL事件.
这样程序可以正确的处理这种情况,
直到手指离开屏幕
//----------------------------------------------------

//---------------15-----------------------------------
FLAG_LAYOUT_INSET_DECOR
//Constant Value: 65536 (0x00010000)
这个flag只能配合 FLAG_LAYOUT_IN_SCREEN 一起使用.
当在屏幕中请求layout时,window可能在一些装饰物(如状态栏)之上或者之后
当使用这个flag时,window manager会报告插入window的矩形大小,
来确保你的内容不会被装饰物(如状态栏)掩盖.
这个flag一般用Window类的 setFlags(int, int)方法来设置
//----------------------------------------------------

//---------------16-----------------------------------
FLAG_ALT_FOCUSABLE_IM
Constant Value: 131072 (0x00020000)
转变  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交互,可以放置在输入法上面
//这个实际上是我强行理解的,翻译得可能不准确,如果要使用的话,还是要自己测试下
//----------------------------------------------------

//---------------17-----------------------------------
FLAG_WATCH_OUTSIDE_TOUCH
//Constant Value: 262144 (0x00040000)
如果你已经设置了FLAG_NOT_TOUCH_MODAL,那么你可以设置FLAG_WATCH_OUTSIDE_TOUCH这个flag,
这样一个点击事件如果发生在你的window之外的范围,你就会接收到一个特殊的MotionEvent,MotionEvent.ACTION_OUTSIDE
注意,你只会接收到点击事件的第一下,而之后的DOWN/MOVE/UP等手势全都不会接收到
//----------------------------------------------------

//---------------18-----------------------------------
FLAG_SHOW_WHEN_LOCKED
//Constant Value: 524288 (0x00080000)
一个特殊的flag,使得window可以在锁屏状态下显示
这个flag会使得window比keyguard或其他锁屏界面具有更高的层级
可以配合FLAG_KEEP_SCREEN_ON使用,点亮屏幕,在显示keyguard window之前显示你的window.
可以配合FLAG_DISMISS_KEYGUARD使用来自动解锁没密码的keyguards
这个flag只能应用在最顶层的全屏window上

用人话说就是可以让window显示在锁屏界面上
//----------------------------------------------------

//---------------19-----------------------------------
FLAG_SHOW_WALLPAPER     //实测没吊用,也有可能我理解得不对
//Constant Value: 1048576 (0x00100000)
请求系统将壁纸显示在window后面,这个window表面需要是透明的才能显示出墙纸.
这个flag只能保证如果你的window有透明的区域,墙纸会显示在那
这个flag也可以在theme中使用 windowShowWallpaper 这个属性来设置.
有些主题已经设置好:     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)
当window被添加或者显示,系统会点亮屏幕,就好像用户唤醒屏幕一样
//----------------------------------------------------

//---------------21-----------------------------------
FLAG_DISMISS_KEYGUARD
//Constant Value: 4194304 (0x00400000)
当使用的是无密码的锁屏界面,显示此window会使锁屏界面被自动解锁,其他废话就不翻译了
//----------------------------------------------------

//---------------22-----------------------------------
FLAG_SPLIT_TOUCH
//Constant Value: 8388608 (0x00800000)
当window设置这个flag,window会接收来自window边界之外发送给其他window的点击事件,支持多点触控.
当这个flag没有设置的时候,第一下点击则决定了哪个window会接收整个点击事件,直到手指拿开.
当设置了这个flag,这每一个点击事件(不一定是第一个)都决定了那个window来接收剩下的点击事件,直到手指拿开.点击事件会被分开传递给多个window.
貌似是关于多点触控的,我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之前来配置

当你在manifest中设置了硬件加速后,这个flag不能用来取消硬件加速

当在Activity标签或者application标签中设置了 hardwareAccelerated = true属性这个flag就自动设置上了
//----------------------------------------------------

//---------------24-----------------------------------
FLAG_LOCAL_FOCUS_MODE
//Constant Value: 268435456 (0x10000000)
设置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负责绘制状态栏的北京
当设置了这个flag,系统状态栏会变透明,同时这个相应的区域会被填满 getStatusBarColor() and getNavigationBarColor()的颜色,
//----------------------------------------------------
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容