三分钟看懂Android事件处理机制

前面介绍了Android应用层的第一个主要机制,现在我们来看事件处理机制。很简单,只要看懂这幅图即可。





总结一下这幅图,

    触摸事件的横向流程是先ACTION_DOWN ->ACTION_MOVE -> ACTION_UP

    触摸事件的纵向流程是先从Activity -> ViewGroup -> View(如上图所示,包裹关系Activity包裹了ViewGroup,ViewGroup包裹了View,触摸View)

    

前面一个ACTION的层级将决定后面ACTION的层级(后面ACTION的层级不能高于前面ACTION的层级,取决于前一个事件消费在哪个层级)

如果消费层级在ViewGroup上,则下一个ACTION不会调用该ViewGrouponInterceptTouchEvent方法,没必要分发,

直接通过dispatchTouchEvent方法跳到onTouchEvent方法去处理,其实最终也是要看是消费在哪个层级

消费在哪个层级就从该层级dispatchTouchEvent方法跳到onTouchEvent方法去处理。


源码分析:

ViewGroupdispatchTouchEvent方法调用super.dispatchTouchEvent中,如下

if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) 

{

。。。。。

newTouchTarget = addTouchTarget(child, idBitsToAssign);

。。。。。

}



dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)

中会去处理子ViewdispatchTouchEvent方法,

最终会调用子ViewonTouchEvent事件,

如果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方法,继而实现了从ViewViewGrouponTouchEvent方法的上层传递













猜你喜欢

转载自blog.csdn.net/u010375903/article/details/79356229
今日推荐