【问题标题】:Override onDraw() or draw()?覆盖 onDraw() 或 draw()?
【发布时间】:2013-01-29 16:48:41
【问题描述】:

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

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

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

谁能解释一下这两者的区别?

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

谢谢

【问题讨论】:

    标签: android draw surfaceview ondraw


    【解决方案1】:

    我尝试清理我的项目,它确实解决了问题。试试看。

    【讨论】:

    • 它并没有“解决”它,它只是清除它。这是一个 lint 错误,默认情况下 lint 在修改后的文件上运行。重新运行 lint 时,会再次出现相同的 lint 错误。
    • 这应该设置为正确答案。这似乎是一个 Eclipse 错误。
    【解决方案2】:

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

    【讨论】:

    • 这只是 SDK 的一个错误假设,它告诉我我应该“可能”调用 draw()?
    • 根据文档,您应该“可能”不会调用 draw(),但这可能真的取决于您的实际代码。
    【解决方案3】:

    我一直有这个问题。

    我是这样处理的:

    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 错误。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 它似乎可以正常工作,但我对添加“抑制错误”并不满意。只是等待它适得其反的那一天..
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多