前面介绍了Android应用层的第一个主要机制,现在我们来看事件处理机制。很简单,只要看懂这幅图即可。
总结一下这幅图,
触摸事件的横向流程是先ACTION_DOWN ->ACTION_MOVE -> ACTION_UP
触摸事件的纵向流程是先从Activity -> ViewGroup -> View(如上图所示,包裹关系Activity包裹了ViewGroup,ViewGroup包裹了View,触摸View)
前面一个ACTION的层级将决定后面ACTION的层级(后面ACTION的层级不能高于前面ACTION的层级,取决于前一个事件消费在哪个层级)
如果消费层级在ViewGroup上,则下一个ACTION不会调用该ViewGroup的onInterceptTouchEvent方法,没必要分发,
直接通过dispatchTouchEvent方法跳到onTouchEvent方法去处理,其实最终也是要看是消费在哪个层级
消费在哪个层级就从该层级dispatchTouchEvent方法跳到onTouchEvent方法去处理。
源码分析:
在ViewGroup的dispatchTouchEvent方法调用super.dispatchTouchEvent中,如下
if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign))
{
。。。。。
newTouchTarget = addTouchTarget(child, idBitsToAssign);
。。。。。
}
dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)
中会去处理子View的dispatchTouchEvent方法,
最终会调用子View的onTouchEvent事件,
如果dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)
返回true则会调用addTouchTarget(child, idBitsToAssign)方法,使得mFirstTouchTarget不为null,
在super.dispatchTouchEvent方法的后续流程中,
if (mFirstTouchTarget == null) {
handled = dispatchTransformedTouchEvent(ev,canceled,
null,TouchTarget.ALL_POINTER_IDS);
}
dispatchTransformedTouchEvent(ev,canceled,null,TouchTarget.ALL_POINTER_IDS)该方法中传入的null参数则使得调用ViewGroup的
super.dispatchTouchEvent方法中,super.dispatchTouchEvent方法中会调用
onTouchEvent方法,继而实现了从View到ViewGroup的onTouchEvent方法的上层传递