基础知识
ViewRoot: 具体实现类ViewRootImpl,是连接WindowManager和DecorView的纽带,View的三大流程(mearsure、layout、draw)均是通过ViewRoot来完成。
DecorView: 作为根View,其实是一个FrameLayout,内部包含一个竖直方向的LinearLayout,这个LinearLayout分为标题栏和内容栏两个部分。
PhoneWindow: Window对象通常由PhoneWindow来实现的,PhoneWindow将一个DecorView设置为整个应用窗口的根View。
MearsureSpec:测量规格,包含测量要求和尺寸的信息,有三种模式:
| 模式 | 二进制数值 | 描述 | 
|---|---|---|
| UNSPECIFIED | 00 | 默认值,父控件没有给子view任何限制,子View可以设置为任意大小。 | 
| EXACTLY | 01 | 表示父控件已经确切的指定了子View的大小。对应LayoutParams中的’match_parent’和具体数值这两种模式 | 
| AT_MOST | 10 | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。对应LayoutParams中的’wrap_content’。 | 
View的绘制流程
整个View树的绘制流程在ViewRoot类的performTraversals()函数展开,绘制函数的调用

再来看一张简化版的自定义View绘制流程函数调用链:

自定义View分类
| 类别 | 继承自 | 特点 | 
|---|---|---|
| View | View SurfaceView 等 | 不含子View | 
| ViewGroup | ViewGroup xxLayout等 | 包含子View | 
自定义View流程:
| 步骤 | 关键字 | 作用 | 
|---|---|---|
| 1 | 构造函数 | View初始化 | 
| 2 | onMeasure | 测量View大小 | 
| 3 | onSizeChanged | 确定View大小 | 
| 4 | onLayout | 确定子View布局(自定义View包含子View时有用) | 
| 5 | onDraw | 实际绘制内容 | 
| 6 | onTouchEvent | 处理屏幕触摸事件。 | 
| 7 | invalidate | 调用onDraw方法,重绘View中变化的部分。 | 
| 8 | 提供接口 | 控制View或监听View某些状态。 | 
文章评论