详解Android触摸事件处理程序

本文详细解析了Android触摸事件处理机制,包括dispatchTouchEvent、onInterceptTouchEvent及onTouchEvent等方法的作用及交互过程。通过实例展示了不同组件如何响应触摸事件,以及事件拦截与消费的具体流程。

详解Android触摸事件处理程序

在了解触摸时间处理程序之前,我们来了解这几个主角:

  • dispatchTouchEvent(MotionEvent ev):此方法允许 ViewGroup 在分派之前截获所有触摸事件
  • onInterceptTouchEvent(MotionEvent ev):此方法允许 ViewGroup 监视分派给子视图的事件
  • onTouchEvent(MotionEvent ev): 在发生触摸屏运动事件时调用

接下来展示一下工作界面,注意,Layout03是嵌套在Layout02里面的

首先,按下Layout03,事件流程如图所示:

按下的时候总共有触发两个事件:ACTION_DOWNACTION_UP,但是因为整个事件流程中并没有哪个组件消费了ACTION_DOWN事件,而只有在onTouchEvent中消费了ACTION_DOWN事件,后续事件ACTION_UP,ACTION_MOVE...才会触发,所以这里ACTION_DOWN事件一路挥歌直下,ACTION_UP则并没有发生。

我们让Layout02onTouchEvent返回true,消费ACTION_DOWN事件,事件流程如图所示:

可以看到Layout02onTouchEvent消费ACTION_DOWN事件之后便不在往下传了,后续事件也随后开始出现,并且Layout02直接将后续事件派发给消费者。所以当一个组件消费了ACTION_DOWN事件时,后续事件从窗口传到该组件的dispatchTouchEvent之后便直接交给它的onTouchEvent方法处理

我们在Layout02onInterceptTouchEvent里返回true,事件流程如下:

这时候事件传递就会发生截断的情况,ACTION_DOWN经过Layout02onInterceptTouchEvent时被强制直接交给自己的onTouchEvent继续传递。此时如果Layout01onTouchEvent消费此事件:

则后续事件就直接传递给Layout01onTouchEvent处理了,如果让Layout02dispatchTouchEvent直接返回true呢? 这种情况下ACTION_DOWN流经Layout02dispatchTouchEvent时就很干脆的断了,后续事件在Layout02dispatchTouchEvent就直接派发给自己的onTouchEvent处理,相当于Layout02在说:我不往下派发了,直接交给我来处理吧!

还有些比较极端的情况:如果让Layout03onTouchEvent来消费ACTION_DOWN事件,后续事件在流经Layout02dispatchTouchEvent的时候就返回了true呢? 如图所示,后续事件在Layout02dispatchTouchEvent就消失了,不再往下传递,Layout03也就接收不到ACTION_UP,ACTION_MOVE之类的后续事件了。最后,如果不在Layout02dispatchTouchEvent返回true,而是在它的onInterceptTouchEvent返回呢? 这时候事件到达Layout02onInterceptTouchEvent之后就变成了ACTION_CENCEL,直到传递给消费者。

转载于:https://my.oschina.net/ClaireChris/blog/530390

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值