View的draw流程
Posted 呼啸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
以上是关于View的draw流程的主要内容,如果未能解决你的问题,请参考以下文章
Android视图的绘制流程(下)——View的Layout与Draw过程