Android Touch事件在View层级结构中的传递机制

在介绍Touch事件的传递之前,先了解一下两个重要的方法——onInterceptTouchEvent和onTouchEvent。

onInterceptTouchEvent()是ViewGroup的一个方法,用于处理事件(是否拦截,类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的onInterceptTouchEvent()

onTouchEvent是View的一个方法,用于处理事件。返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控件)传递,一但返回True,则父控件不用操心自己来处理Touch事件。返回False,则向上传递给父控件。

另外,需要注意的是down事件处理的返回值至关重要,down事件处理的返回值直接影响到后续move和up事件的接收和传递。如果down事件返回false,那么后续的move和up事件也不会处理了。


onInterceptTouchEvent和onTouchEvent的详细说明

1.down事件首先会传递到onInterceptTouchEvent()方法。
2.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,表示不拦截,那么down事件就不会再传递给该ViewGroup的onTouchEvent方法,down事件会传递到子控件。但是后续的move,up等事件将继续会先传递给该ViewGroup的onInterceptTouchEvent方法。
3.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理。并且,childView将接收不到任何事件。
4..如果该ViewGroup的onInterceptTouchEvent()在接收到move事件返回true,就将事件传递给自身的onTouchEvent方法,之后该ViewGroup的onInterceptTouchEvent就不再处理move事件。up事件的处理就先由onTouchEvent处理,再由onInterceptTouchEvent处理。并且不会向子控件传递。
即ViewGroup中事件的执行顺序如下:
onInterceptTouchEvent move----onTouchEvent move----onTouchEvent move----onTouchEvent move----onTouchEvent up----onInterceptTouchEvent up
如果该ViewGroup的onInterceptTouchEvent()在接收到move事件返回false,就传递给子控件。
5.如果最终需要处理事件的view的onTouchEvent()返回了false,表示事件没有被消耗,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。

6.如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值