之前的文章《View体系(六)View工作流程入口》提到View
的工作流程包括了measure
、layout
和draw
的过程,今天我们就来看一下View
的draw
流程是怎样的。
(注:文中源码基于
Android 12
)
View
的draw
流程很简单,源码里的注释官方也写的很清楚,我们看View
的draw
方法:
public void draw(Canvas canvas) {
...
// Step 1, draw the background, if needed
drawBackground(canvas);
...
// skip step 2 & 5 if possible (common case)
...
// Step 2, save the canvas' layers
...
// Step 3, draw the content
onDraw(canvas);
...
// Step 4, draw the children
dispatchDraw(canvas);
...
// Step 5, draw the fade effect and restore layers
...
// Step 6, draw decorations (foreground, scrollbars)
onDrawForeground(canvas);
...
// Step 7, draw the default focus highlight
drawDefaultFocusHighlight(canvas);
总览
官方注释已经清楚的写了每一步的工作:
- 如果需要,则绘制背景(
drawBackground
) - 保存当前canvas层
- 绘制View的内容(
onDraw
) - 绘制子View(
dispatchDraw
) - 如果需要,则绘制View的褪色边缘,类似于阴影效果
- 绘制装饰,比如滚动条(
onDrawForeground
) - 绘制默认焦点高亮效果(
drawDefaultFocusHighlight
)
注释中说明了第2步和第5步可以跳过,这里就不展开讲解,在此重点分析其他步骤。
步骤1:绘制背景
进入View
的drawBackground
方法:
private