O processo de desenho do View é realmente muito simples. As notas oficiais explicam claramente as etapas de cada etapa:
1. Pinte o fundo, se desejar.
2. Salve a camada de tela atual.
3. Desenhe o conteúdo da Visualização.
4. Desenhe a View filha.
5. Se desejar, desenhe as bordas esmaecidas da Visualização, que são semelhantes a um efeito de sombra.
6. Desenhe decorações, como barras de rolagem.
Entre eles, 2 e 5 podem ser pulados diretamente. Vejamos as etapas restantes.
1. Desenhe o fundo
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);
}
}
Como você pode ver no código a seguir, os parâmetros de deslocamento scrollX e scrollY são levados em consideração ao desenhar o plano de fundo. Se houver um valor de deslocamento diferente de 0, o plano de fundo será desenhado na tela de deslocamento.
if ((scrollX | scrollY) == 0) {
background.draw(canvas);
} else {
canvas.translate(scrollX, scrollY);
background.draw(canvas);
canvas.translate(-scrollX, -scrollY);
}