View的Draw过程是对View的绘制,包括背景,内容等。
1.View的Draw过程
代码
public void draw(Canvas canvas) {
...
if (!dirtyOpaque) {
// Step 1,绘制View的背景
drawBackground(canvas);
}
final int viewFlags = mViewFlags;
boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;
boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
if (!verticalEdges && !horizontalEdges) {
// Step 2, 绘制View的内容
if (!dirtyOpaque) onDraw(canvas);
// Step 3, 绘制子View
dispatchDraw(canvas);
drawAutofilledHighlight(canvas);
// Overlay is part of the content and draws beneath Foreground
if (mOverlay != null && !mOverlay.isEmpty()) {
mOverlay.getOverlayView().dispatchDraw(canvas);
}
// Step 4, 绘制滑动条,前景等
onDrawForeground(canvas);
...
return;
}
onDraw()方法是一个空实现,自定义View需要复写该方法。
dispatchDraw()方法是一个空实现,因为这个方法是ViewGroup绘制其子View的方法,而View没有子View的。
流程图
draw() -> drawBackground() -> onDraw() -> dispatchDraw() -> onDrawScrollBars()
2.ViewGroup的Draw过程
代码
public void draw(Canvas canvas) {
...
if (!dirtyOpaque) {
// Step 1,绘制View的背景
drawBackground(canvas);
}
final int viewFlags = mViewFlags;
boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;
boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
if (!verticalEdges && !horizontalEdges) {
// Step 2, 绘制View的内容
if (!dirtyOpaque) onDraw(canvas);
// Step 3, 绘制子View
dispatchDraw(canvas);
drawAutofilledHighlight(canvas);
// Overlay is part of the content and draws beneath Foreground
if (mOverlay != null && !mOverlay.isEmpty()) {
mOverlay.getOverlayView().dispatchDraw(canvas);
}
// Step 4, 绘制滑动条,前景等
onDrawForeground(canvas);
...
return;
}
ViewGroup的绘制流程与View的绘制流程的不同在于dispatchDraw()方法
protected void dispatchDraw(Canvas canvas) {
...
// 1. 遍历子View
final int childrenCount = mChildrenCount;
...
for (int i = 0; i < childrenCount; i++) {
...
if ((transientChild.mViewFlags & VISIBILITY_MASK) == VISIBLE ||
transientChild.getAnimation() != null) {
// 2. 绘制子View
more |= drawChild(canvas, transientChild, drawingTime);
}
...
}
}
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
流程图
draw() -> drawBackground() -> onDraw() -> dispatchDraw() -> onDrawScrollBars() -> child.draw()
draw()方法的发起
ViewRootImpl -> performTraversals() -> performDraw() -> draw() -> drawSoftware() -> mView.draw()
这里的mView指的是DecorView。