【问题标题】:Do I need to call back super.onDraw() in a custom view?我需要在自定义视图中回调 super.onDraw() 吗?
【发布时间】:2012-04-09 02:42:10
【问题描述】:

我不太清楚这一点,文档也不是。

当我创建自定义视图时,我会这样覆盖:

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    //more code here...
}

我的问题是是否有必要致电super.onDraw(canvas);。没有它,代码似乎也能正常工作,但我想确保可以不使用它。

那么有必要吗?

【问题讨论】:

  • 不知道是否需要,但原则上这是个好习惯。
  • 如果你想让超类实现的代码也被执行,你只需要调用super.onDraw()。如果您不依赖自定义 View 的超类所做的绘图(例如,所有必需的绘图都在本地覆盖的方法中完成),那么您不需要调用它,除非文档另有明确说明。

标签: android android-custom-view


【解决方案1】:

如果你希望它调用超类的 onDraw 方法(想想 TextView 或 KeyboardView 而不是泛型 View),那么调用 super.onDraw。如果您不希望这样,即您计划自己绘制整个视图(您似乎是这样),则没有理由调用它。

此外,如果您正在扩展 View(而不是扩展视图的某个类),super.onDraw 并没有真正做任何事情。

对我来说,当我想在 KeyboardView 上画线时,我会调用 super.onDraw。因此,super.onDraw 绘制了键盘,而我的自定义 LatinKeyboardView(它扩展了 KeyboardView)在键盘顶部绘制了滑动路径。

【讨论】:

  • 是的,如果您想在按键上绘制任何额外内容,我认为 KeyboardView 需要 super.onDraw()。
【解决方案2】:

查看源代码显示View.onDraw() 是一个空方法。因此,调用super.onDraw(),如果父类本身是View,则什么也不做。这是不必要但无害的。

您是否应该继续这样做是效率、安全和风格的单独问题。

【讨论】:

    【解决方案3】:

    是的,是的。如果您自定义一个 TextView,super.onDraw 将确保绘制属于 TextView 属性的任何内容(如文本、文本颜色、文本阴影等...)与其他视图(如 Button、CheckBox...)相同...

    如果您的自定义 View 扩展 View(不是 View 的特定子类,只是 View),最好将 super.onDraw(canvas) 留在那里以用于某些 View 的绘制方法(如 setBackgroundDrawable 等...)

    【讨论】:

      【解决方案4】:

      除非您实际上覆盖了onDraw() 方法,否则这不是必需的。如果新类没有覆盖它,就会自动调用super的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        相关资源
        最近更新 更多