详解Android触摸事件处理程序

原创
2015/11/14 21:25
阅读数 120

详解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,直到传递给消费者。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部