想要自定义控件交互性的手势中用的比较多,那么就要理解事件的分发机制,网络上大部分的介绍其实也不太让人看的明白,所以我尝试用我的理解来为大家写一篇通俗易懂的文章,首先必须知道
ViewGroup 所拥有的三个方法 dispatchTouchEvent - > onInterceptTouchEvent - > onTouchEvent
View 作为最小单元 所以不触发onInterceptTouchEvent 那么只有dispatchTouchEvent - > onTouchEvent
Activity 也有 dispatchTouchEvent - > onTouchEvent,它是Window层分发下来的 我们开始说执行流程
以触发DOWN事件为例
dispatchTouchEvent 返回状态
super.dispatchTouchEvent(ev) 表示事件继续分发,如果当前是视图组会触发 onInterceptTouchEvent
true 表示处理了事件,那么不再继续向下层控件分发事件, 所有传递到此为止
false 表示不处理这个事件,那么会触发上层控件onTouchEvent
onInterceptTouchEvent 返回状态
super.onInterceptTouchEvent(ev) 效果等同于返回false 事件不进行拦截 会继续向下分发事件
true 事件拦截,如果当前是视图组会触发 onTouchEvent
onTouchEvent 返回状态
super.onTouchEvent(ev) 效果等同于返回false 事件执行 会向上层视图回调
true 事件消费 终止事件传递
以视图组为例 上面为activity 下面有一个View
super.dispatchTouchEvent(ev) --> super.onInterceptTouchEvent(ev) --> super.onTouchEvent(ev)
true --> super.onInterceptTouchEvent(ev) --> super.onTouchEvent(ev)
false --> super.onInterceptTouchEvent(ev) --> super.onTouchEvent(ev)
这就是它事件传递时触发流程了, 除了dispatchTouchEvent,其他两种要么消费要么不消费很容易,只不过它多了一个super状态触发拦击方法
下一篇给大家分析它里面源码,为什么是这个流程