22

我的项目是基于 surfaceView 的,到目前为止,我已经在 onDraw 中进行了所有渲染,我将其覆盖。一切似乎都很好。

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

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

有人可以解释这两者之间的区别吗?

我在网上阅读了一些类似的问题,但没有找到我理解的解释。

谢谢

4

6 回答 6

22

I tried cleaning my project and it did solve the problem. Try it.

于 2013-05-28T08:10:28.043 回答
12

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() 为空。它由你来实施。

于 2013-02-14T00:14:56.327 回答
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() 方法而不会出现错误...

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

于 2013-09-05T08:53:59.113 回答
2

请注意,在绘图的情况下,当 ViewGroup 想要在其子视图上绘制内容时,通常会使用覆盖draw()并调用super.draw 。onDraw中绘制的内容会出现在 children 下。</p>

于 2014-08-12T12:55:37.883 回答
2

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

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

于 2014-10-16T04:46:18.937 回答
-3

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

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

于 2013-02-14T00:03:46.760 回答