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)分发事件: