View的绘制流程

1.View树的绘制流程

      当Activity接收到焦点的时候,它会被请求绘制布局,该请求由Android framework处理,绘制是根节点开始,对布局树进行measure和draw。整个View树的绘制流程在ViewRoot.java类的PerfromTraversals()函数展开,该函数所做的工作可简单概况为是否需要重新计算视图的大小(measure),是否需要重新安置视图的位置(layout),以及是否需要进行重绘(draw)流程图如下:

View绘制流程函数调用链

需要所明的是:用户主动调用request,值会触发measure和layout过程,而不会执行draw过程.

2.概念

measure和layout

从整体上来看Measure和Layout两个步骤的执行:

树的遍历是有序的,由父视图到子视图,每一个ViewGroup负责绘制它所有的子视图,而最底层的View会负责绘制自身。

具体分析

measure过程由measure(int,int)方法发起,从上到下有序的测量View,在measure过程的最后,每个视图存储了自己的尺寸大小和测量规格。layout过程由layout(int,int,int,int)方法发起,也是从上而下进行遍历。在该过程中,每个父视图会根据measure过程得到的尺寸来摆放自己的子视图。

measure过程会成为一个view及所有子几节点的mMeasuredWidth和mMeasureHeight变量赋值,该值可以通过getMeasuredWidth()和getMeasuredHeight()方法获得。而且这两个值必须在父视图约束范围之内,这样才可以保证所有的父视图都接收所有子视图的测量。如果子视图对于Measure得到的大小不满意的时候,父视图会介入并设置测量规则进行第二次measure。比如,父视图可以先根据未给定的dimension去测量每一个子视图,如果最终子视图的未约束尺寸太大或者太小的时候,父视图会使用一个确切的大小再次对子视图进行measure。

Measure过程传递尺寸的两个类

1.ViewGroup.LayoutParams(View自身的布局参数)

2.MeasureSpecs类(父视图对子视图的测量要求)

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