覆盖onDraw()或draw()?

时间:2013-02-13 23:47:38

标签: android draw surfaceview ondraw

我的项目基于surfaceView,到目前为止,我已经在onDraw中完成了所有渲染,而我已经覆盖了。一切似乎都没问题。

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

  

可疑方法通话;应该叫“画”而不是“onDraw”

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

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

谢谢

6 个答案:

答案 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()允许您手动将画布绘制到屏幕上(您必须自己制作画布)。