前言:在重新整理知识点时点开了以前关注的一位大神的两篇博客,在这里记录一下要点。以下是两篇原文地址:
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
正文:上面的两篇博文分别讲View的事件分发机制与ViewGroup的事件分发机制。事件分发都是从当前Activity开始,由最父层的布局一直分发到当前触发的组件,也就是层级传递,这期间默认如果有谁消费了事件,则不再继续分发(除非重写了事件传递的返回值),如果到当前触发事件的这个组件也没有消费该事件,则又一层层往回走,直到最父层,这期间如果也没有谁消费事件,则事件消失。
一、View的事件分发机制
1、onTouch 与 onTouchEvent都是在dispatchTouchEvent方法中调用的,当被点击的组件是可enable,且注册了点击或触摸事件,则会调用onTouch。且默认调用了onTouch就不会再继续调用onTouchEvent方法。
2、onclick方法是在onTouchEvent中调用的(performClick),但当被点击的组件是可clickable时才会被调用,否则onTouchEvent中在条件判断时会直接返回false,也就是说在默认情况下当组件没有注册touch监听时,该事件不会被此View消费。
二、ViewGroup的事件分发机制
1、ViewGroup可以通过onInterceptTouchEvent方法来拦截事件,如果该事件被拦截,则不会继续往下分发,该方法默认返回false,即不拦截用户事件。
2、基于View的事件分发机制(组件最终消费事件都是通过继承了view的dispatchTouchEent执行的),如果子View消费了用户事件,则事件不会再分发下去,否则会继续分发,直至被消费。
3、如果所有子View都没有消费该事件,则又会一层一层返回,如果父组件也没有消费该事件,事件消失。