Android 窗口Flags详解

Android 窗口Flags详解,第1张

这里主要探讨Touchable,Focusable,OutsideTouchable,TouchModal这四个混合使用的效果。

最简单的Touchable,

为false,表示窗口不接受触摸事件

为true,表示窗口接受触摸事件;

要窗口接收事件,必须为true。窗口不接受事件,意味着事件会透传到下一个窗口。这里的窗口事件是指DOWN-UP,窗口是指窗口自身范围,窗口外的ACTION_OUTSIDE与此设置无关。

为false,表示对ACTION_OUTSIDE事件不感兴趣。

为true,表示对ACTION_OUTSIDE事件感兴趣,此时, 如果新事件被另一个窗口消化 ,则会发送ACTION_OUTSIDE给该窗口。包括:

2.1. 如果窗口设置了Touchable为false。即使触摸事件在窗口内,由于不处理事件,导致事件透传,被另一个窗口消化,此时该窗口也会收到ACTION_OUTSIDE。

2.2 触摸事件在窗口外面触发,导致事件被另一个窗口消化,此时该窗口也会收到ACTION_OUTSIDE。

2.3 如果窗口设置了TouchModal和Focusable,导致窗口内外的事件被当前窗口截获,由于不是被另一个窗口消化,所以即使设置了OutsideTouchable,也不会有ACTION_OUTSIDE。

为false,表示不会聚焦,所以不会有软键盘。同时它的z-order可以在软键盘之上,覆盖软键盘。如果你在不聚焦的情况下,还需要软键盘,可以使用FLAG_ALT_FOCUSABLE_IM来修改。 如果为false,会放弃TouchModal原来的值,强制设置TouchModal为false

为true,表示窗口可以聚焦。

TouchModal的设置,只有在Focusable为true时才有效,Focusable为false,会忽略TouchModal的值

为true,当窗口Focusable为true时,无论窗口内外,事件都被当前窗口接收。

为false,当窗口Focusable为true时,只有窗口内的事件被当前窗口接收。窗口外,OutsideTouchable的设置决定了是否有ACTION_OUTSIDE事件。

为true,当窗口Focusable为false时,设置不生效。

为false,当窗口Focusable为false时,设置不生效。

FLAG_NOT_TOUCHABLE,意味着,默认是TOUCHABLE,必要时,才使用这个Flag关闭。

FLAG_NOT_FOCUSABLE,意味着,默认是FOCUSABLE,必要时,才使用这个Flag关闭。

FLAG_WATCH_OUTSIDE_TOUCH,意味着,默认是不关心,必要时,才使用这个Flag开启。

FLAG_NOT_TOUCH_MODAL,意味着,默认是TOUCH_MODAL,必要时,才使用这个Flag关闭。

FLAG_NOT_FOCUSABLE的注释是这样的。This flag will also enable FLAG_NOT_TOUCH_MODAL whether or not that is explicitly set.

所谓的enable,就是使用这个Flag 。直接翻译就是,使用了FLAG_NOT_FOCUSABLE这个Flag,就会同时使用FLAG_NOT_TOUCH_MODAL这个flag。

使用FLAG_NOT_FOCUSABLE就是关闭FOCUSABLE,使用FLAG_NOT_TOUCH_MODAL就是关闭TOUCH_MODAL。简述就是,关闭了FOCUSABLE,会同时关闭TOUCH_MODAL。

比如,Touchable,当一个事件确实派发到窗口到时候,就看这个Flag,为true就是接受事件,为false就是不接受事件。你可以提前截获不让事件派发到窗口,但一旦派发到窗口,就是这个Flag来决定窗口是否接受事件。

比如,OutsideTouchable,你可以截获事件不让事件派发到另一个窗口,但一旦事件派发到另一个窗口,就是这个Flag决定当前窗口是否接受ACTION_OUTSIDE事件。

以下,窗口内外是指,触点在窗口内/外。完整事件是指DOWN to UP事件流。ACTION_OUTSIDE事件只有一次。

总结, Touchable和OutsideTouchable分别控制了窗口内外的事件

总结, 当且仅当Focusable为true,TouchModal为true情况下,窗口内外事件才被当前窗口截获;否则,都是窗口内才有完整事件,窗口外才有ACTION_OUTSIDE事件

//设置窗体全屏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)

//设置窗体始终点亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,

WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

//设置窗体背景模糊

getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,

WindowManager.LayoutParams.FLAG_BLUR_BEHIND)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12087024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存