WindowManager.LayoutParams Flag 含义

简介: WindowManager.LayoutParams Flag 含义

WindowManager.LayoutParams Flag 含义

在弄悬浮窗时,设置WindowManager添加的view禁止点击时,view禁用到ontouch,onclick,isenable都是不管用的,醉了。只能设置 WindowManager.LayoutParams的 flag。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()的颜色


目录
相关文章
|
5月前
|
Java Android开发 开发者
RelativeLayout.LayoutParams布局属性详解
RelativeLayout.LayoutParams布局属性详解
|
编解码 Android开发
Android Paint ANTI_ALIAS_FLAG 引起的一个小问题
Android Paint ANTI_ALIAS_FLAG 引起的一个小问题
205 0
Android Paint ANTI_ALIAS_FLAG 引起的一个小问题
|
XML Android开发 数据格式
View默认的LayoutParams是何时生成的,默认值是什么。layout_width和layout_height属性在哪里生效
View默认的LayoutParams是何时生成的,默认值是什么。layout_width和layout_height属性在哪里生效
|
机器学习/深度学习 数据建模 vr&ar
为什么都是ViewGroup的LayoutParams,也会报cannot be cast to android.view.ViewGroup$MarginLayoutParams?
为什么都是ViewGroup的LayoutParams,也会报cannot be cast to android.view.ViewGroup$MarginLayoutParams?
380 0