重写onDraw()或draw()?

我的项目是基于surfaceView,直到现在我已经把我所有的渲染放在了onDraw中,这是我的重点。 一切似乎都没问题。

不过,我刚刚更新了我的SDK,现在它给了我一个错误告诉我:

可疑的方法调用; 应该可能叫“画”而不是“onDraw”

有人能解释这两者之间的区别吗?

我已经读过网上的一些类似的问题,但我没有find我理解的解释。

谢谢

Solutions Collecting From Web of "重写onDraw()或draw()?"

SurfaceView.draw()基本上调用View.draw(); 如果你想实现你的绘图,你应该在View.onDraw()中实现它,这是为了实现甚至在源代码注释中说的。

这个方法被ViewGroup.drawChild()调用来让每个子视图自己绘制。 这个draw()方法是一个实现细节,并不打算被覆盖或从ViewGroup.drawChild()以外的其他地方调用。

至于他们之间的区别:
画():

13416 /* 13417 * Draw traversal performs several drawing steps which must be executed 13418 * in the appropriate order: 13419 * 13420 * 1. Draw the background 13421 * 2. If necessary, save the canvas' layers to prepare for fading 13422 * 3. Draw view's content 13423 * 4. Draw children 13424 * 5. If necessary, draw the fading edges and restore layers 13425 * 6. Draw decorations (scrollbars for instance) 13426 */ 

onDraw()是空的。 它为你执行。

我试图清理我的项目,它确实解决了这个问题。 尝试一下。

我从来没有这个问题。

我这样处理:

1)声明如下的方法。

 @SuppressLint("WrongCall") public void drawTheView() { theCanvas = null; try{ theCanvas = getHolder().lockCanvas(); if(theCanvas != null) { onDraw(theCanvas); } } finally { getHolder().unlockCanvasAndPost(theCanvas); } } 

2)现在你可以修改onDraw()方法:

 @Override public void onDraw(Canvas canvas) { //Do some drawing } 

您可以从任何地方调用drawTheView()方法,并以这种方式调用onDraw()方法而不会出现错误…

我认为这是一个实际的方法。

请注意,在绘制的情况下,当ViewGroup想要在其子视图上绘制内容时,经常使用重写draw()和调用super.draw 。 在onDraw中绘制的内容将显示在子节点下。

正如friiky所说, @SuppressLint("WrongCall")解决了我的问题。 但是它必须在方法名称前面,而不是在上面。

我所做的是将鼠标放在错误代码上,右键单击并selectAdd @SuppressLint("WrongCall")

onDraw给你一个canvas画在屏幕上。

draw()允许你手animation一个canvas到屏幕上(你必须自己做canvas)。