我的项目基于surfaceView,到目前为止,我已经在onDraw中完成了所有渲染,这是我重写的。一切似乎都没问题。重写onDraw()或draw()?
不过,我刚刚更新了我的SDK,现在它给我一个错误,告诉我:
可疑的方法调用;应该可能叫“画”而不是“onDraw”
请问有人能解释这两者之间的区别吗?
我已经读过网上的一些类似的问题,但我没有找到我理解的解释。
感谢
我的项目基于surfaceView,到目前为止,我已经在onDraw中完成了所有渲染,这是我重写的。一切似乎都没问题。重写onDraw()或draw()?
不过,我刚刚更新了我的SDK,现在它给我一个错误,告诉我:
可疑的方法调用;应该可能叫“画”而不是“onDraw”
请问有人能解释这两者之间的区别吗?
我已经读过网上的一些类似的问题,但我没有找到我理解的解释。
感谢
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希望在其子视图绘制内容super.draw经常被使用。内容在onDraw将出现在儿童下。
正如friiky所说,@SuppressLint("WrongCall")
解决了我的问题。但是它必须在方法名称的前面,而不是上面。
我所做的是把鼠标放在错误代码,右键单击并选择Add @SuppressLint("WrongCall")
它似乎工作和一切,但我不是很高兴添加一个'压制错误'。只是在等待一天倒退。 – eigil 2016-07-28 16:52:52
这只是一个不正确的假设,然后它告诉我我应该'可能'调用draw()? – Zippy 2013-02-14 01:16:30
基于文档,你可能'不应该调用draw(),但它可能真的取决于你的实际代码是什么。 – wtsang02 2013-02-14 01:32:01