View的draw流程

 View的draw流程其实很简单,官方的注释,非常清晰的说明了每一步的做法:

1.如果需要,则绘制背景。

2.保存当前canvas层。

3.绘制View的内容。

4.绘制子View.

5.如果需要,则绘制View的褪色边缘,这类似于阴影效果。

6.绘制装饰,比如滚动条。

其中2,5可以直接跳过。我们来看下剩下的步骤。

1.绘制背景

 private void drawBackground(Canvas canvas) {
        final Drawable background = mBackground;
        if (background == null) {
            return;
        }

        setBackgroundBounds();

        // Attempt to use a display list if requested.
        if (canvas.isHardwareAccelerated() && mAttachInfo != null
                && mAttachInfo.mThreadedRenderer != null) {
            mBackgroundRenderNode = getDrawableRenderNode(background, mBackgroundRenderNode);

            final RenderNode renderNode = mBackgroundRenderNode;
            if (renderNode != null && renderNode.hasDisplayList()) {
                setBackgroundRenderNodeProperties(renderNode);
                ((RecordingCanvas) canvas).drawRenderNode(renderNode);
                return;
            }
        }

        final int scrollX = mScrollX;
        final int scrollY = mScrollY;
        if ((scrollX | scrollY) == 0) {
            background.draw(canvas);
        } else {
            canvas.translate(scrollX, scrollY);
            background.draw(canvas);
            canvas.translate(-scrollX, -scrollY);
        }
    }

大家从下面这段代码可以看出,绘制背景考虑偏移参数scrollX和scrollY。如果有偏移值不为0,则会在偏移后的canvas中绘制背景。

 if ((scrollX | scrollY) == 0) {
            background.draw(canvas);
        } else {
            canvas.translate(scrollX, scrollY);
            background.draw(canvas);
            canvas.translate(-scrollX, -scrollY);
        }

猜你喜欢

转载自blog.csdn.net/howlaa/article/details/128717074