view的工作流程主要是指measure,layout,draw这三大流程,即测量,布局和绘制,其中measure确定View的测量宽/高,layout确定view的最终宽/高和四个顶点的位置,而draw将view绘制到屏幕上。
measure方法是一个final类型的方法,即子类不能够重写此方法,在view的measure方法中会调用view的onMeasure方法,
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
public static int getDefaultSize(int size, int measureSpec) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result;
}
getDefaultSize返回的大小就是measureSpec中的specSize.
layout的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定后,它在onLayout中会遍历所有的子元素并调用其layout方法,在layout方法中onLayout方法又会被调用。onLayout方法则会确定所有子元素的位置。
draw的作用是将View绘制到屏幕上面,绘制过程遵循如下几步:
1.绘制背景background.draw(canvas)
2.绘制自己onDraw
3.绘制children(dispatchDraw)
4.绘制装饰(onDrawScrollBars)