美文网首页
Android View 绘制流程 ( 三) Draw

Android View 绘制流程 ( 三) Draw

作者: 是刘航啊 | 来源:发表于2021-01-01 13:19 被阅读0次
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 绘制自己。

onDraw.jpg
总结

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

到这里 View 绘制流程就全部介绍完了,如果有什么写得不对的,可以在下方评论留言,我会第一时间改正。

相关文章

网友评论

      本文标题:Android View 绘制流程 ( 三) Draw

      本文链接:https://www.haomeiwen.com/subject/ymthoktx.html