在自定义视图中,我需要调用super.onDraw()吗?

21

我对此并不太清楚,文档也是如此。

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

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

    //more code here...
}

我的问题是是否需要调用super.onDraw(canvas);。在没有它的情况下代码似乎可以正常工作,但我想确保可以将其省略。

那么这是必要的吗?


不知道是否需要,但原则上这是一个好的实践。 - trutheality
只有在想要执行超类实现的代码时,才需要调用 super.onDraw()。如果您不依赖于自定义 View 的超类所做的绘图(例如,所有必需的绘图都在本地覆盖的方法中完成),则不需要调用它,除非文档明确说明需要调用。 - MH.
4个回答

21

如果你想调用父类的onDraw方法(比如TextView或KeyboardView,而不是通用的View),那么调用super.onDraw。如果你不想这样做,即你计划自己绘制整个View(这似乎是你的意图),那么没有必要调用它。

另外,如果你扩展的是View(而不是某个扩展了View的类),那么调用super.onDraw实际上并没有什么作用。

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


是的,我同意KeyboardView需要super.onDraw(),如果你想在按键上绘制任何额外的内容。 - IgorGanapolsky

10
一看源代码就会发现View.onDraw()是一个空方法。因此,如果父类是View本身,则调用super.onDraw()不起任何作用。这是不必要的但无害的。
是否应该继续这样做是关于效率、安全性和风格的另一个问题。

3

是的,它确实是这样的。如果你定制了一个TextView,super.onDraw将确保绘制任何属于TextView属性的内容(如文本、文本颜色、文本阴影等)。其他视图,如按钮、复选框等也是同样的。

如果你的自定义视图扩展了View(不是View的特定子类,只是View),最好还是在某些View的绘制方法(如setBackgroundDrawable等)中保留super.onDraw(canvas)。


0

除非您实际上要覆盖 onDraw() 方法,否则不需要这样做。如果新类没有覆盖它,那么超类的方法将自动被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接