基础知识
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某些状态。 |
文章评论