View绘制流程

Activity: 代表一个完整界面,提供了一个窗口来绘制各种视图。
当一个应用启动时,会启动一个主Activity,系统会根据Activity的布局对它进行绘制。
绘制会从根视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树。
每个View控件负责绘制自己,ViewGroup还需负责同志自己的子View进行绘制操作。

视图绘制过程



private void performTraversals() {
...
int childWidthMeasureSpec = getRootMeasureSpec(mWidth,lp.width);
int childHeightMeasureSpec = getRootMeasureSpec(mHeighth,lp.height);
...
//执行测量流程
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
...
//执行布局流程
performLayout(childWidthMeasureSpec, childHeightMeasureSpec);
...
//执行绘制流程
performDraw(childWidthMeasureSpec, childHeightMeasureSpec);
}

MeasureSpec

属于View中的一个静态内部类,用来说明如何测量这个View。
一个32位的整型值。
高2位表示测量模式(SpecMode):
    ·UNSPECIFIED  : 不指定测量模式,父视图没有限制子视图大小
    ·EXACTLY      :  精确测量模式,当该视图width,height指定为具体数值或者match_parent是生效,表示父视图决定了子视图的精确大小,该模式下View的测量值就是SpecSize的值
    ·AT_MOST      :  最大值模式,当该视图的width,height指定为wrap_content时生效,此时子视图大小不超过父视图允许的最大尺寸
低30位表示该测量模式下的规格大小(SpecSize)。

Measure

Measure操作用来计算View的实际大小,最终的测量时通过回调onMeasure方法实现的。

Layout

Layout过程用来确定View在父容器中的布局位置,它是由父容器获取子View的位置参数后,调用子View的layout方法并将位置蚕食传入实现的。

Draw

Draw操作用来将控件绘制出来。

你可能感兴趣的:(View绘制流程)