目录
- FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
- FLAG_DIM_BEHIND
- FLAG_NOT_FOCUSABLE
- FLAG_NOT_TOUCHABLE
- FLAG_NOT_TOUCH_MODAL
- FLAG_TOUCHABLE_WHEN_WAKING
- FLAG_KEEP_SCREEN_ON
- FLAG_LAYOUT_IN_SCREEN
- FLAG_LAYOUT_NO_LIMITS
- FLAG_FULLSCREEN
- FLAG_SECURE
- FLAG_IGNORE_CHEEK_PRESSES
- FLAG_LAYOUT_INSET_DECOR
- FLAG_ALT_FOCUSABLE_IM
- FLAG_WATCH_OUTSIDE_TOUCH
- FLAG_SHOW_WHEN_LOCKED
- FLAG_TURN_SCREEN_ON
- FLAG_DISMISS_KEYGUARD
- FLAG_SPLIT_TOUCH
- FLAG_HARDWARE_ACCELERATED
- FLAG_LOCAL_FOCUS_MODE
- FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
- 摘抄
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同时表明了这个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()的颜色
摘抄
1、《WindowManager.LayoutParams的各种flag含义》