view 事件处理机制

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 处理。

    原文作者:4ff5e1e6459f
    原文地址: https://www.jianshu.com/p/11cf1102517e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞