ViewGroup事件传递、分发
(注:本文旨在相互印证,探讨,因为我也是总结自己的想法,可能有错误的地方,希望有前辈发现问题能帮我指正,感谢!)
1)
- 1.1)事件由根布局向内(顶)层传递
- 1.2)大致传递过程:
view :
1.dispatchTouchEvent
2.onTouch (touchListener)
3.touchEvent (包含其他事件,如click)
viewGroup:
1.dispatchTouchEvent
2.onInterceptTouchEvent
3.onTouch
4.touchEvent
(补充:viewGroup extends View !)
-
2) 事件先由根布局ViewGroup接收:dispatchTouchEvent
-
2.1) 先判断是否是按压事件,如果是,初始化参数
其中有很多过程,我拿出了一个对下文比较重要的一个参数:
mFirstTouchTAarget 一定会被制为null。
- 2.2) 紧接着,确定当前ViewGroup是否被拦截。
-
2.2.1) 如果不是则事件继续向下传递,(内容转接 下文 标题3))
-
2.2.2) 如果被拦截,则会把当前的ViewGroup当作一个View处理,调取
super.dispatchTouchEvent();
其中dispatchTransFormTouchEvevt方法中,当传递的child为null时,会直接调取基类的dispatchTouchView方法
- 3)
如果viewGroup 的拦截器中(我就那么一叫.),没有设置拦截,那么他默认是false,就会判断当前的ViewGroup的按压地方,存在几个View(就像最上面的xml布局图中,button1,与 button2,有一块重叠的部分,当点击这个部分的时候,两个child都会被分发到事件)
图中的代码是被删减过的,我把其中的主干提出来了。
- 3.1 )
获取按压中的子view,并从上自下,顺序排列。也就是说,等下分发按压事件的时候,会先分发给button2这个按钮
- 3.2)分发事件:
这里要说明一点的是,如果是好多层viewGroup嵌套,流程是一样,都是这个一样的流程,一样的代码,因为红框里面不是继续会调子部件的dispatchTouchEvent方法么。
- 3.3)
- 3.3.1)如果分发过后,没有子部件能消耗掉本次按压事件,则会一路返还,把事件还给父容器ViewGroup处理。
父容器则调取自己的super.dispatchTouchEvent,消耗事件。
这时,mFirstTouchTarget还是null;