WindowManager Flag对View触摸事件的影响

WindowManager Flag对View触摸事件的影响

使用场景

  1. FLAG_NOT_FOCUSABLE:使当前View不会获得焦点,此View会将焦点传递到下层可获取焦点的View
  2. FLAG_NOT_TOUCH_MODAL:允许当前View获取焦点,也允许View范围外的点击事件传递给下层的View
  3. FLAG_NOT_TOUCHABLE:使View无法获取焦点
  4. FLAG_WATCH_OUTSIDE:当View范围外的点击事件发生时,View将收到MotionEvent.ACTION_OUTSIDE
  5. FLAG_SPLIT_TOUCH:使View能收到View范围之外发送给其他View的点击事件,支持多点触控

①FLAG_NOT_FOCUSABLE

    public static final int FLAG_NOT_FOCUSABLE   = 0x00000008;
  • 设置了此Flag的View不会获取焦点,也不需要接受各种输入事件,以及此Flag会同时启动FLAG_NOT_TOUCH_MODAL,最终输入事件会直接传递给下层具有焦点的View。View之外能点击

  • 如果没有设置FLAG_NOT_FOCUSABLE,那么屏幕上弹窗之外的地方不能点击。

  • 补充1:在View中添加隐藏status bar、navigation bar的代码,View设置FLAG_NOT_FOCUSABLE,在View中会导致不能与系统bar交互(status bar及navigation bar没有被隐藏)。

  • 补充2:上层View设置FLAG_NOT_FOCUSABLE,下层View没有设置,在按压TV遥控器上的上、下、左、右键会跳过View1,直接在下层可获取焦点的View2上获取焦点。

在这里插入图片描述

②FLAG_NOT_TOUCH_MODAL

    public static final int FLAG_NOT_TOUCH_MODAL  = 0x00000020;
  • 设置了这个Flag,则当前View允许获取焦点,View之外的点击事件传递给下层的View。

  • 不设置这个Flag,则当前View消费掉所有点击事件,不管点击事件是否在View的范围之内。
    在这里插入图片描述

③FLAG_NOT_TOUCHABLE

    public static final int FLAG_NOT_TOUCHABLE   = 0x00000010;
  • 设置了这个FLAG,那么这个View无法获取touch事件。

在这里插入图片描述

④FLAG_WATCH_OUTSIDE_TOUCH

    public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;        
  • 需先设置FLAG_NOT_TOUCH_MODAL。
  • 若点击事件在vIew范围之外,会收到MotionEvent:MotionEvent.ACTION_OUTSIDE。
    只会接收到点击事件的第一下,而后的DOWN/MOVE/UP等手势不会接收到。

在这里插入图片描述

⑤FLAG_SPLIT_TOUCH

    public static final int FLAG_SPLIT_TOUCH = 0x00800000; 
  • 不设置,第一下点击则决定了哪个窗口会接收整个点击事件,直到手指拿开为止。
  • 设置了,每一个点击事件(不一定是第一个)都决定了那个窗口来接收剩下的点击事件,直到手指拿开为止,从而使多指触摸事件会被分开传递给多个窗口。

在这里插入图片描述

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值