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);
}