Android 绘制顺序

来源:互联网 发布:网络摄像机厂家 编辑:程序博客网 时间:2024/05/17 12:48

  • 转载于
    • View的绘制顺序
      • draw 总调度方法
    • 两个注意事项
      • 为什么需要调用 setWillNotDraw
      • 优先使用 onDraw

转载于

强烈推荐:http://hencoder.com/ui-1-5/

View的绘制顺序

这里写图片描述
这里写图片描述

draw() 总调度方法

除了 onDraw() dispatchDraw() 和 onDrawForeground() 之外,还有一个可以用来实现自定义绘制的方法: draw()。

draw() 是绘制过程的总调度方法。一个 View 的整个绘制过程都发生在 draw() 方法里。前面讲到的背景、主体、子 View 、滑动相关以及前景的绘制,它们其实都是在 draw() 方法里的。

// View.java 的 draw() 方法的简化版大致结构(是大致结构,不是源码哦):

public void draw(Canvas canvas) {      ...    drawBackground(Canvas); // 绘制背景(不能重写)    onDraw(Canvas); // 绘制主体    dispatchDraw(Canvas); // 绘制子 View    onDrawForeground(Canvas); // 绘制滑动相关和前景    ...}

两个注意事项

  1. 在 ViewGroup 的子类中重写除 dispatchDraw() 以外的绘制方法时,
    可能需要调用

    setWillNotDraw(false)
  2. 在重写的方法有多个选择时,优先选择 onDraw()。

为什么需要调用 setWillNotDraw

出于效率的考虑,ViewGroup 默认会绕过 draw() 方法,换而直接执行 dispatchDraw(),以此来简化绘制流程。所以如果你自定义了某个 ViewGroup 的子类(比如 LinearLayout)并且需要在它的除 dispatchDraw() 以外的任何一个绘制方法内绘制内容,你可能会需要调用 View.setWillNotDraw(false) 这行代码来切换到完整的绘制流程(是「可能」而不是「必须」的原因是,有些 ViewGroup 是已经调用过 setWillNotDraw(false) 了的,例如 ScrollView)。

优先使用 onDraw

有的时候,一段绘制代码写在不同的绘制方法中效果是一样的,这时你可以选一个自己喜欢或者习惯的绘制方法来重写。但有一个例外:如果绘制代码既可以写在 onDraw() 里,也可以写在其他绘制方法里,那么优先写在 onDraw() ,因为 Android 有相关的优化,可以在不需要重绘的时候自动跳过 onDraw() 的重复执行,以提升开发效率。享受这种优化的只有 onDraw() 一个方法。