Android自定义View基础--事件分发

Android自定义View基础--事件分发

从上图可以看出一个Activity的根View是DecorView,DecorView继承了FrameLayout,而FrameLayout 继承了ViewGroup。
所以我们搞明白ViewGroup与View的事件分发逻辑,及其dispatchTouchEvent与onInterceptTouchEvent还有onTouchEvent,其中onInterceptTouchEvent是ViewGroup独有的。搞明白这三个方法的调用关系,就明白了事件分发。下面用公司处理事物的方式来说明下事件分发,

图一:公司职务与ViewGroup和View的对应关系
Android自定义View基础--事件分发

图二:公司处理事物流程图
Android自定义View基础--事件分发
图三:Android事件分发模型(参考图二来看图三容易理解)

Android自定义View基础--事件分发

最后总结:
ViewGroup和View 的dispatchTouchEvent 是做事件分发,

一般情况下dispatchTouchEvent()一般不会用于重写, 它会自动分发给onInterceptTouchEvent(),如果onInterceptTouchEvent()的ACTION_DOWN 里面返回fasle就代表自己不处理这个事件,而是交给下一个去处理它,。

ViewGroup和View的onTouchEvent方法是做事件处理的,

1、自己消费掉,事件终结,不再传给谁----->return true;
2、继续从下往上传,不消费事件,让父View也能收到到这个事件----->return false;View的默认实现是不消费的。所以super==false。

ViewGroup的onInterceptTouchEvent方法对于事件有两种情况:

1、拦截下来,给自己的onTouchEvent处理—>return true;
2、不拦截,把事件往下传给子View---->return false,ViewGroup默认是不拦截的,所以super==false;