dispatchTouchEvent == 分发方法
onInterceptTouchEvent == 拦截方法
一组事件由一个 down 事件,若干个 move 事件和一个 up 事件 组成,down 事件的处理结果决定后续事件由哪个 view 处理。
down 事件首先来到 viewgroup 的 分发方法,此方法返回 false 表示不处理事件,后续事件不会传给它和它的子 view。返回 true 则后续事件都传给它。
如果在 down 事件时 分发方法 调用super.dispatchTouchEvent,那么事件会经过 拦截方法,这个方法返回 true 就表示要拦截事件不往下传,这时候 down 事件会到 ontouchevent,根据它的返回值决定要不要处理后续事件。
拦截方法返回 false 或者调用 super.onInterceptTouchEvent 都表示不拦截,事件就会交给子 view 的 分发方法。
子 view 的分发方法跟 viewgroup 差不多,不同的是子 view 没有拦截方法,所以子 view 的分发方法调用 super.dispatchTouchEvent 会把 down 事件直接交给 ontouchevent,而不是先经过拦截方法。
以上就是 down 事件的传递流程。当一个 view 或 viewgroup 在 分发方法 或 ontouchevent 方法中返回 true 之后,后续事件会通过这个 view 所属的 viewgroup 的 分发方法 和 拦截方法 传递给这个 view 的分发方法。也就是说子 view 决定要处理后续事件,viewgroup 还是能在 分发 和 拦截 方法里拦截后续事件。子 view 可以给父 viewgroup 设置不拦截标志 。
子 view 的 分发方法 接收到后续事件后可以自己处理,也可以通过调用 super.dispatchTouchEvent 把事件给 ontouchevent 处理。