这里主要探讨Touchable,Focusable,OutsideTouchable,TouchModal这四个混合使用的效果。
最简单的Touchable,
为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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)