当前位置:  开发笔记 > 编程语言 > 正文

覆盖onDraw()或draw()?

如何解决《覆盖onDraw()或draw()?》经验,为你挑选了3个好方法。

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

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

可疑方法电话; 应该叫"画"而不是"onDraw"

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

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

谢谢



1> KarenAnne..:

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


它没有"解决"它,它只是清除它.这是一个lint错误,默认情况下lint是在修改过的文件上运行的.重新运行lint时,将再次出现相同的lint错误.

2> wtsang02..:

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()为空.它为您实施.



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()方法而不会得到错误...

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

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有