绘制顺序
绘制过程与顺序
绘制过程 绘制顺序注意事项:
1.在 ViewGroup 的子类中重写除 dispatchDraw() 以外的绘制方法时,可能需要调用 setWillNotDraw(false)
(出于效率的考虑,ViewGroup 默认会绕过 draw() 方法,换而直接执行 dispatchDraw()以此来简化绘制流程,ScrollView等已调用过)
2.在重写的方法有多个选择时,优先选择 onDraw()
(Andorid优化了无需绘制时自动跳过onDraw的重复执行,以提升开发效率)
drawBackground()
简介:背景,方法是private不能重写所以不能自定义绘制,只能用自带API设置
(XML中android:background 或 Java中View.setBackgroundXxx)
onDraw()
简介:负责自身主体内容绘制
1.绘制代码 在 super.onDraw() 之后
先执行原有内容绘制,再执行绘制代码,新绘制内容盖住控件原来的内容
常用场景:为控件增加点缀性内容
新绘制内容在上层2.绘制代码 在 super.onDraw() 之前
先执行绘制代码,再执行原有内容绘制,原有内容盖住新绘制内容
常用场景:给文字绘制背景色
原有内容在上层注:View类中onDraw()是空实现的,继承View类代码写在super.onDraw()前后都没关系,甚至可以不写super.onDraw()
dispatchDraw()
简介:绘制子 View 的方法
场景:比如需要让LinearLayout 的绘制内容盖住子 View,则必须在dispatchDraw中让它的绘制代码在子 View 的绘制之后再执行
(由于绘制顺序,如果在onDraw中绘制,会被子view盖住)
注:View 和 ViewGroup都有dispatchDraw()方法,但由于View没有子view,所以该方法只对ViewGroup有意义
1.绘制内容 在 super.dispatchDraw() 之后
新绘制内容在子View上层2.绘制内容 在 super.dispatchDraw() 之前
结果:子view在上层(新绘制内容在ondraw之后,在dispatchDraw之前,被子view盖住)
onDrawForeground()
简介:依次绘制滑动边缘渐变、滑动条和前景
滑动:可通过 XML中android:scrollbarXXX 或 Java中View.setXXXScrollbarXXX()设置
前景:可通过 XML中android:foreground 或 Java中View.setForeground()设置,需 Android 6.0(API 23)支持
1.绘制内容在 super.onDrawForeground() 之后
先绘制在滑动边缘渐变、滑动条和前景,再执行绘制内容,新绘制内容盖住滑动和前景
新绘制内容在上层2.绘制内容 在 super.onDrawForeground() 之前
先执行绘制内容,在dispatchDraw() 和 super.onDrawForeground() 之间,所以会盖住子view,但被滑动、前景盖住
滑动、前景在上层注:不能在滑动边缘渐变、滑动条和前景之间插入绘制代码,因为这三部分的绘制被一起写进了onDrawForeground()中
draw()
简介:绘制过程的总调度方法
1.绘制内容 在 super.draw() 之后
绘制内容会盖住其他的所有绘制内容
2.绘制内容 在 super.draw() 之前
绘制内容会被其他所有的绘制内容盖住(也会被背景盖住)
场景:EditText 有背景下划线背景但又需要绿色背景,替换背景会使下划线消失,此时在绘制背景前绘制绿色即可
在所有其他绘制之前