ビューの描画プロセス

 View の描画プロセスは実際には非常に単純で、公式ノートには各ステップの手順が明確に説明されています。

1. 必要に応じて背景をペイントします。

2. 現在のキャンバスレイヤーを保存します。

3. ビューのコンテンツを描画します。

4. 子ビューを描画します。

5. 必要に応じて、影効果に似た、ビューの色あせたエッジを描画します。

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以外の場合、背景はオフセットキャンバス上に描画されます。

 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