我的项目基于surfaceView,到目前为止,我已经在onDraw中完成了所有渲染,而我已经覆盖了。一切似乎都没问题。
但是,我刚刚更新了我的SDK,现在它给我一个错误告诉我:
可疑方法通话;应该叫“画”而不是“onDraw”
有人可以解释一下这两者之间的区别吗?
我已经在网上阅读了一些类似的问题,但我找不到我理解的解释。
谢谢
答案 0 :(得分:22)
我尝试清理我的项目并确实解决了问题。试试吧。
答案 1 :(得分:11)
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()为空。它可供您实施。
答案 2 :(得分: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()方法而不会出现错误......
我认为这是一种实用的方法。
答案 3 :(得分:2)
请注意,在绘图的情况下,当ViewGroup想要在其子视图上绘制内容时,通常会使用覆盖 draw()并调用 super.draw 。在 onDraw 中绘制的内容将显示在子项目下。
答案 4 :(得分:2)
正如friiky所说,@SuppressLint("WrongCall")
解决了我的问题。但是它必须位于方法名称的前面,而不是上面的名称。
我所做的是将鼠标放在错误代码上,右键单击并选择Add @SuppressLint("WrongCall")
答案 5 :(得分:-3)
onDraw
为您提供绘制到屏幕的画布。
draw()
允许您手动将画布绘制到屏幕上(您必须自己制作画布)。