2013-02-13 67 views
19

我的项目基于surfaceView,到目前为止,我已经在onDraw中完成了所有渲染,这是我重写的。一切似乎都没问题。重写onDraw()或draw()?

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

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

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

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

感谢

回答

10

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()是空的。它为你实现。

+0

这只是一个不正确的假设,然后它告诉我我应该'可能'调用draw()? – Zippy 2013-02-14 01:16:30

+0

基于文档,你可能'不应该调用draw(),但它可能真的取决于你的实际代码是什么。 – wtsang02 2013-02-14 01:32:01

-3

onDraw给你一个画布绘制到屏幕上。

draw()允许您手动绘制画布到屏幕(您必须自己制作画布)。

+0

两者都有的画布。 – pablisco 2014-05-19 09:53:33

21

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

+7

它不“解决”它,它只是清除它。这是一个lint错误,默认情况下lint是在修改的文件上运行的。当棉绒重新运行时,同样的棉绒误差会重新出现。 – laalto 2013-08-05 09:00:47

+0

哦,谢谢@laalto。 :) – KarenAnne 2013-08-05 10:45:19

+1

这应该被设置为正确的答案。这似乎是一个Eclipse错误。 – HAL9000 2013-12-08 10:12:04

7

我有这个问题,因为有史以来。

我这样处理:

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()方法,这种方法没有得到错误...

我认为这是一种实用的方法。

2

注意,在图纸的情况下,覆盖平局()和调用时的ViewGroup希望在其子视图绘制内容super.draw经常被使用。内容在onDraw将出现在儿童下。

2

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

我所做的是把鼠标放在错误代码,右键单击并选择Add @SuppressLint("WrongCall")

+0

它似乎工作和一切,但我不是很高兴添加一个'压制错误'。只是在等待一天倒退。 – eigil 2016-07-28 16:52:52