美文网首页
绘制顺序

绘制顺序

作者: jadefly | 来源:发表于2018-11-20 16:57 被阅读0次

    绘制过程与顺序

    绘制过程 绘制顺序

    注意事项:

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

    在所有其他绘制之前

    相关文章

      网友评论

          本文标题:绘制顺序

          本文链接:https://www.haomeiwen.com/subject/mmmjxqtx.html