View和ViewGroup中的绘制

一、让ViewGroup中执行onDraw()

ViewGroup默认情况下,出于性能考虑,会被设置成WILL_NOT_DROW,这样,ondraw就不会被执行了。
如果我们想重写一个viewgroup的ondraw方法,有两种方法:
1,构造函数中,给viewgroup设置一个颜色。
2,构造函数中,调用setWillNotDraw(false),去掉其WILL_NOT_DRAW flag。
在viewgroup初始化的时候,它调用了一个私有方法:initViewGroup,它里面会有一句setFlags(WILLL_NOT_DRAW,DRAW_MASK);相当于调用了setWillNotDraw(true),所以说,对于ViewGroup,他就认为是透明的了,如果我们想要重写onDraw,就要调用setWillNotDraw(false)。

二、 在view中执行 invalidate()requestLayout()的区别

2.1、执行invalidate()

view中执行 invalidate()

onDraw() --> dispatchDraw()

执行 requestLayout()

View和ViewGroup中的绘制_第1张图片
view中执行 requestLayout()

view中 onMeasure()-->onLayout()-->onDraw() --> dispatchDraw()
viewGroup中 onMeasure()-->onLayout() --> dispatchDraw()

2.2、在viewGroup中执行 invalidate()requestLayout()的区别

执行invalidate()

viewGroup中执行 invalidate()

dispatchDraw()

执行 requestLayout()

View和ViewGroup中的绘制_第2张图片
viewGroup中执行 requestLayout()

viewGroup中 onMeasure()-->onLayout() --> dispatchDraw()

你可能感兴趣的:(View和ViewGroup中的绘制)