记住一个原则:android自定义view绘制时,先绘制的内容会被后绘制的覆盖。
view的绘制顺序是:
背景–>view 主体–>子view–>滑动边缘渐变和滑动条–>前景
见下图:
注: draw()方法是总调度方法,所以如果把绘制代码写在 super.draw() 的下面,那么这段代码会在其他所有绘制完成之后再执行。
在 ViewGroup 的子类中重写除 dispatchDraw() 以外的绘制方法时,可能需要调用 setWillNotDraw(false);
因为:出于效率的考虑,ViewGroup 默认会绕过 draw() 方法,换而直接执行 dispatchDraw(),以此来简化绘制流程。
所以如果你自定义了某个 ViewGroup 的子类(比如 LinearLayout)并且需要在它的除 dispatchDraw() 以外的任何一个绘制方法内绘制内容,你可能会需要调用 View.setWillNotDraw(false) 这行代码来切换到完整的绘制流程。在重写的方法有多个选择时,优先选择 onDraw()。