ViewGroup篇
2016-09-20 13:51:42 0 举报
ViewGroup是Android中一个非常重要的概念,它是一种特殊的View,可以包含其他View(子View)并对其布局进行管理。通过使用ViewGroup,开发者可以将多个View组合在一起,实现更复杂的界面布局。ViewGroup提供了一些方法来控制子View的排列、对齐和尺寸等属性。常见的ViewGroup有LinearLayout、RelativeLayout、FrameLayout等。使用ViewGroup可以提高代码的复用性和可维护性,使界面设计更加灵活和高效。在Android开发中,掌握ViewGroup的使用是非常重要的基础知识。
作者其他创作
大纲/内容
而ViewGroup处理起事件比较复杂是因为,他要将找到处理事件的子视图,拿到其反馈,然后根据反馈决定是将事件传递下去还是自己消费掉
否
newTouchTarget==nullmFirstTouchTarget==null
false
child没有消费该事件
dispatchTouchEvent
是
这又分两种情况1.拦截DOWN事件2.对在MOVE事件进行拦截以上两个拦截情况需要结合实际需求
以上两个判断确定很重要的两个标志位:1.父类是否拦截该事件2.父类是否找到消费该事件的子类剩下所有的判断都围绕着这两个标志位
将该MOVE事件变成CANCEL事件交给子孩子
场景二:父类拦截了事件
RelativeLayout
intercepted
DOWN事件来临
dispatchTransformedTouchEvent
intercepted=true
Android事件分发ViewGroup篇
onInterceptTouchEvent
子视图消费了DOWN事件但是父视图拦截了MOVE事件,即将intercept=true
actionMasked == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null
对于DOWN事件,首先让将之前留下的状态全部清空,恢复初始状态
cancelAndClearTouchTargets(ev); resetTouchState();
父视图接手所有事件子视图接受不到任何事件
注:mFirstTouchTarget ==null因为DOWN事件被父视图处理了
对DOWN事件的处理全部跳过直接进入该判断剩下的事情就交给父视图了(他被当做一个View)
执行child的dispatchTouchEvent
当我点击Button
如果父类拦截了DOWN事件那么子类根本就没有获得任何事件的机会所有的事件都会交给父视图处理如果没有拦截
Button
mFirstTouchTarget==null执行父视图super.dispatchTouchEvent该函数的返回值作为父视图dispatchTouchEvent的返回值
ACTION_DOWN事件的处理
MOVE事件来临
拦截
将mFirstTouchTarget=null
对于View来说,处理事件的逻辑是简单的,当他拿到事件后,他只需告诉他的父视图,他是否消费了该事件即可,父视图会根据他的反馈来决定是否分发下一次的事件
根据上图来一步步分析ViewGroup的事件分发机制
场景一:子类的dispatchTouchEvent返回了false(父类不拦截)
View事件分发流程
注:这里并没有执行父视图的onInterceptTouchEvent
0 条评论
下一页