ViewRootImpl -> performTraversals
private void performTraversals() {
...
performMeasure();
performLayout();
performDraw();
...
}
ViewRootImpl -> performDraw
private void performDraw() {
...
boolean canUseAsync = draw(fullRedrawNeeded);
...
}
ViewRootImpl -> draw
private boolean draw(boolean fullRedrawNeeded) {
...
if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset,
scalingRequired, dirty, surfaceInsets)) {
return false;
}
...
}
ViewRootImpl -> drawSoftware
private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,
boolean scalingRequired, Rect dirty, Rect surfaceInsets) {
...
mView.draw(canvas);
...
}
mView.draw() -> View.draw()
这里要注意这的 mView 其实是 DecorView
View -> draw
public void draw(Canvas canvas) {
...
//画背景
drawBackground(canvas);
//draw the content
onDraw(canvas);
//draw the children
dispatchDraw(canvas);
...
}
onDraw 就是绘制自己的内容,dispatchDraw 绘制子 View 的内容
LinearLayout -> dispatchDraw ( ViewGroup )
protected void dispatchDraw(Canvas canvas) {
...
for (int i = 0; i < childrenCount; i++) {
...
drawChild(canvas, transientChild, drawingTime);
...
}
...
}
ViewGroup -> drawChild
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
又会执行到 View.draw() 方法,让每一个子 View 绘制自己。

总结
Draw 流程会先绘制父容器的背景和内容,然后通过 dispatchDraw 方法便利子 View,让子 View 去绘制自己的内容。
网友评论