2012-04-09 87 views
15

我对此不太清楚,也没有文档。我是否需要在自定义视图中回调super.onDraw()?

当我创建一个自定义视图,我重写像这样:

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

    //more code here... 
} 

我的问题是,是否有必要调用super.onDraw(canvas);。如果没有它,代码似乎可以正常工作,但我想确保可以放弃它。

那么有必要吗?

+0

不知道是否需要,但原则上这是个好习惯。 – trutheality 2012-04-09 02:49:29

+0

如果你想让超类实现的代码也被执行,你只需要调用'super.onDraw()'。如果你不依赖于你自定义的'View'的超类所做的绘图(例如,所有需要的绘图都在你的本地覆盖方法中完成),那么你不需要调用它,除非文档明确指出。 – 2012-04-09 02:49:50

回答

13

如果你想要它调用超类的onDraw方法(认为TextView或KeyboardView而不是普通的视图),然后调用super.onDraw。如果你不想这样做,也就是说你打算自己绘制整个视图(看起来你是这样),没有理由去调用它。另外,如果你在扩展View(而不是扩展视图的某个类),super.onDraw并没有真正做任何事情。

对于我来说,当我想通过KeyboardView画线时,我会调用super.onDraw。所以,super.onDraw绘制键盘,我的自定义LatinKeyboardView(它扩展了KeyboardView)在键盘上绘制了滑动路径。

+0

是的,我第二次说KeyboardView需要super.onDraw(),如果你想绘制任何额外的键。 – 2012-08-15 02:44:38

0

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

+0

?在我的问题中,我清楚地写道,我*是*覆盖它... – yydl 2012-04-09 02:46:09

+0

@yydl然后是的,它会。 – Whymarrh 2012-04-09 02:52:52

2

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

如果你的自定义视图扩展视图(不是视图的特定子类,只是视图),最好留下super.onDraw(画布)那里的一些视图的绘制方法(如setBackgroundDrawable等...)

8

查看源代码显示View.onDraw()是一个空方法。所以,打电话super.onDraw(),如果父类是View本身,什么都不做。这是不必要的,但无害。

无论你应该继续做还是做一个单独的效率,安全和风格问题。

相关问题