1.draw过程
就是将view绘制到屏幕上
1.1 view的draw
public void draw(Canvas canvas) {
final int privateFlags = mPrivateFlags;
mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;
/*
* Draw traversal performs several drawing steps which must be executed
* in the appropriate order:
*
* 1. Draw the background
* 2. If necessary, save the canvas' layers to prepare for fading
* 3. Draw view's content
* 4. Draw children
* 5. If necessary, draw the fading edges and restore layers
* 6. Draw decorations (scrollbars for instance)
*/
....
}
基本绘制步骤:
- 绘制背景drawBackground(canvas);
- 绘制自己onDraw(canvas);
- 绘制子元素dispatchDraw(canvas);
- 绘制前景装饰onDrawForeground(canvas);
- 绘制焦点高亮drawDefaultFocusHighlight(canvas);
自定义view继承自View,onDraw(canvas)方法中,canvas提供来丰富的API,可以绘制直线、巨型、圆、弧度…
1.2 ViewGroup的draw
viewGroup有drawChild方法,内部调用draw
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
child.draw(3个参数)会调用view.draw(Canvas), 流程回到了view的draw
ViewGroup没有覆写onDraw()方法,使用的是View的onDraw()方法