Android 中和事件分发相关的主要有三个方法,分别是 dispatchTouchEvent(…)、onInterceptTouchEvent(…) 和 onTouchEvent(…),主要作用是分发事件、是否拦截事件以及处理事件,这些方法的返回值决定了 Touch 事件的传递方向,方法的包涵情况具体如下表所示:

dispatchTouchEvent(…) onInterceptTouchEvent(…) onTouchEvent(…)
Activity yes no yes
ViewGroup yes yes yes
view yes no yes

以下为事件分发流程图(针对于 ACTION_DOWN 事件,可点击查看大图)

如图所示的事件传递流向已十分清晰,demo 也十分易写,只需自行重写这些方法,打印日志便可验证。

对于 ACTION_MOVE 和 ACTION_UP 事件的传递则略有不同,它们的传递和 ACTION_DOWN 事件传递的终点相关,以下举例。

1)在 View 的 onTouchEvent 消费事件,即 return true。

日志:

事件传递的流向图:

2)在 ViewGroup 的 onTouchEvent(…) 消费事件,即 return true。

日志:

事件传递的流向图:

3)在 ViewGroup 的 dispatchTouchEvent(…) 方法中 return false。

日志:

事件传递流向图: