【发布时间】:2013-01-29 16:48:41
【问题描述】:
我的项目是基于surfaceView 的,到目前为止,我已经在onDraw 中进行了所有渲染,而我正在覆盖它。一切似乎都很好。
但是,我刚刚更新了我的 SDK,现在它给了我一个错误提示:
可疑的方法调用;应该叫“draw”而不是“onDraw”
谁能解释一下这两者的区别?
我在网上阅读了一些类似的问题,但没有找到我理解的解释。
谢谢
【问题讨论】:
标签: android draw surfaceview ondraw
我的项目是基于surfaceView 的,到目前为止,我已经在onDraw 中进行了所有渲染,而我正在覆盖它。一切似乎都很好。
但是,我刚刚更新了我的 SDK,现在它给了我一个错误提示:
可疑的方法调用;应该叫“draw”而不是“onDraw”
谁能解释一下这两者的区别?
我在网上阅读了一些类似的问题,但没有找到我理解的解释。
谢谢
【问题讨论】:
标签: android draw surfaceview ondraw
我尝试清理我的项目,它确实解决了问题。试试看。
【讨论】:
SurfaceView.draw() 基本上调用View.draw(); 如果你想实现你的绘图,你应该在View.onDraw() 中进行,这是由你来实现的,甚至在源代码cmets 中都说。
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() 方法而不会出现错误...
我认为这是一种实用的方法。
【讨论】:
import android.annotation.SuppressLint;,我花了一段时间才弄清楚为什么会出现cannot find symbol 错误。
请注意,在绘图的情况下,当 ViewGroup 想要在其子视图上绘制内容时,通常会使用覆盖 draw() 并调用 super.draw。 onDraw 中绘制的内容将出现在子项下。
【讨论】:
正如friiky 所说,@SuppressLint("WrongCall") 解决了我的问题。但是它必须在方法名称的前面,而不是上面。
我所做的是将鼠标放在错误代码上,右键单击并选择Add @SuppressLint("WrongCall")
【讨论】:
onDraw 给你一个画布来绘制到屏幕上。
draw() 允许您手动在屏幕上绘制画布(您必须自己制作画布)。
【讨论】: