安卓的事件分发机制非常绕脑,很容易一知半解。其中涉及到四个关键概念,前三个是方法,它们什么时候被调用,返回值起什么作用各不相同,最后一个是一个引用变量,它何时为null何时不为null决定了方法的调用。
- dispatchTouchEvent
- onInterceptTouchEvent
- onTouchEvent
- mFirstTouchTarget
mFirstTouchTarget
什么时候不为null
当当前ViewGroup的onInterceptTouchEvent不拦截DOWN事件,即onInterceptTouchEvent返回false时,会遍历子view寻找到一个事件落在其内部的子view,调用该子view的dispatchTouchEvent,如果该子view的dispatchTouchEvent返回了true,则mFirstTouchTarget设为该子view,如果没有子view返回true则为null。
什么时候为null
如果onInterceptTouchEvent拦截了DOWN事件,则不会遍历子view,mFirstTouchTarget为null;或者如果onInterceptTouchEvent拦截了后续的事件,则mFirstTouchTarget被置null。
综上,只要onInterceptTouchEvent不拦截并子view的dispatchTouchEvent返回true就不为null,只要onInterceptTouchEvent拦截就为null。
误区
有一种误解认为mFirstTouchTarg