在ViewGroup中默认是不进行绘制的,onDraw()和draw(canvas)方法都不会调用,因为ViewGroup为了提升性能默认情况下是不开启绘制的,可以通过调用setWillNotDraw(false)
打开ViewGroup的绘制。
setWillNotDraw怎么实现的?
我们知道绘制的流程是:
draw(Canvas canvas, ViewGroup parent, long drawingTime)->draw(Canvas canvas)->onDraw(Canvas canvas)->dispatchDraw(Canvas canvas)
,在dispatchDraw()方法中会遍历调用子view的draw(Canvas canvas, ViewGroup parent, long drawingTime)
方法绘制子view。
setWillNotDraw()
方法就是改变了draw(Canvas canvas, ViewGroup parent, long drawingTime)->draw(Canvas canvas)
的流程,导致draw(Canvas canvas)、onDraw(Canvas canvas)
方法不被调用,只调用了dispatchDraw(Canvas canvas)
方法。
boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) {
if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
dispatchDraw(canvas);
} else {
draw(canvas);
}
}
从draw(Canvas canvas, ViewGroup parent, long drawingTime)
方法中可以看出,设置了PFLAG_SKIP_DRAW
之后只会调用dispatchDraw()方法,否则走draw()方法。