我的项目是基于 surfaceView 的,到目前为止,我已经在 onDraw 中进行了所有渲染,我将其覆盖。一切似乎都很好。
但是,我刚刚更新了我的 SDK,现在它给了我一个错误,告诉我:
可疑的方法调用;可能应该叫“draw”而不是“onDraw”
有人可以解释这两者之间的区别吗?
我在网上阅读了一些类似的问题,但没有找到我理解的解释。
谢谢
我的项目是基于 surfaceView 的,到目前为止,我已经在 onDraw 中进行了所有渲染,我将其覆盖。一切似乎都很好。
但是,我刚刚更新了我的 SDK,现在它给了我一个错误,告诉我:
可疑的方法调用;可能应该叫“draw”而不是“onDraw”
有人可以解释这两者之间的区别吗?
我在网上阅读了一些类似的问题,但没有找到我理解的解释。
谢谢
I tried cleaning my project and it did solve the problem. Try it.
SurfaceView.draw()基本上调用View.draw(); 如果你想实现你的绘图,你应该在View.onDraw()中进行,这是供你实现的,甚至在源代码注释中也有说明。
这个方法被 ViewGroup.drawChild() 调用来让每个子视图自己绘制。这个 draw() 方法是一个实现细节,不打算被覆盖或从除 ViewGroup.drawChild() 之外的任何其他地方调用。
至于它们之间的区别:
draw():
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中绘制的内容会出现在 children 下。</p>
正如friiky所说,@SuppressLint("WrongCall")
解决了我的问题。但是它必须在方法名称的前面,而不是上面。
我所做的是将鼠标放在错误代码上,右键单击并选择Add @SuppressLint("WrongCall")
onDraw
给你一个画布来绘制到屏幕上。
draw()
允许您手动将画布绘制到屏幕上(您必须自己制作画布)。