19

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

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

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

    //more code here...
}

我的问题是是否有必要打电话super.onDraw(canvas);。没有它,代码似乎可以正常工作,但我想确保可以忽略它。

那么有必要吗?

4

4 回答 4

19

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

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

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

于 2012-04-09T02:56:15.267 回答
9

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

无论如何,你是否应该继续这样做是效率、安全和风格的单独问题。

于 2012-05-24T01:24:26.763 回答
2

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

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

于 2012-04-09T02:51:05.347 回答
0

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

于 2012-04-09T02:45:18.143 回答