绘制顺序

2018-11-20  本文已影响0人  jadefly

绘制过程与顺序

绘制过程 绘制顺序

注意事项:

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 有背景下划线背景但又需要绿色背景,替换背景会使下划线消失,此时在绘制背景前绘制绿色即可

在所有其他绘制之前
上一篇下一篇

猜你喜欢

热点阅读