Android View 详解

要想搞清楚绘制流程,先要了解Android 中view的树结构。

在这里插入图片描述从源码的角度解析一下上面的图:
首先 DecorView 的父类是个FrameLayout
在这里插入图片描述然后就是下图进一步详细的说 带有TitleView ContentView
在这里插入图片描述其中指导源码里面的视图就是这个 ,也行你会有疑问 Android 系统源码的xml资源文件在哪里?在frameworks/res
在这里插入图片描述然后这个文件在PhoneWindow里面加载

在这里插入图片描述然后phonewindow 给decorview 加载
在这里插入图片描述
在这里插入图片描述所以说 DecorView 里面是 一个linearlayout 里面 有Titleview 和content 点视图。最外层是Phonewindow的Framelayout。当然这只是custom_tttle 源码中还有其他布局文件,比如 没有title的等等。

我们主要关注的是Activity ,ViewGroup ,View ,触摸事件的传递方向就是从上到下,再从下返回上,这种u型结构。表述一下:一个触摸事件触发,先来到Actvity的DispatchTouchEvent 方法,Activity接着去询问ViewGroup的dispatchTouchEnvent方法,你告诉我,ViewGroup调用onInterceptouchEvent问自己要不要拦截处理,我不拦截,好,那我问我的子view,调用view的dispachTouchEvent方法,view调用onTouchEvent()方法,到底了,开始往上反。第一种情况:true,告诉你们我处理了,那viewGroup的dispachtouchEvent方法收到true,好,儿子处理了,那我就不用调用我的onTouchEvent方法了,那我赶紧告诉activity,activity的dispachTouchEvent方法收到true的回答,那我Acitity也不用再调用ontouchEvent的方法了。第二种情况:子view 我ontouchEvnet 返回fasle, 告诉你们我不处理,那ViewGroup的dispachTouchEvent就收到fasle,既然儿子不处理,那我调用我的ontouchEvent方法,我的ontoucheEnvent 如果处理了,那Activity的就dispachTouchEvent 收到true,好,父亲干了,也行,我就不用调用ontouchEvnet了,反之,父亲也不干,false告诉你们,那activity的DispachTouchEvent 收到fasle,那activity还要调用ontouchEvent ,事件又回到了顶端。大家都不干。

还有个问题就是大家都不干的时候,为什么Activity 会来两遍

然后是绘制问题:

在这里插入图片描述
ViewRootImpl 类里面的 performTraversals 方法里面会分别调用performMeasure ,performlayout,performdraw方法,分别对应的是onMeasure,onLayout,onDraw 方法。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
需要注意ViewGroup遍历子view的顺序问题,因为viewGroup和view 要遍历树的结构的,所以是从ViewGroup onMeasure 调用它的子view onMeasure,拿返回结果,再调用 自己的onlayout,先横着走,再竖着走。还有就是自定义view或viewGroup的时候, 自定义ViewGroup需要重写onmeasure ,onlayout ,ondraw是由子view完成的,它不需要管,自定义View 不用管onlayout方法,布局是它父控件的事,只需要重写onMeasure和ondraw方法就行。

猜你喜欢

转载自blog.csdn.net/u012553125/article/details/126304174