Android onDraw()是一个可疑的方法调用。

3

对于一个安卓画布游戏,我使用以下(精简版)方式请求SurfaceView的重绘:

    private void refreshView() {
        c = surfaceView.getHolder().lockCanvas();
        synchronized (surfaceView.getHolder()) {
            surfaceView.onDraw(c);
        }

但是自从上一个Android SDK(22.2.1)以来,我在surfaceView.onDraw上收到了Lint警告。

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

当我使用draw而不是onDraw时,屏幕保持黑色。当我使用postInvalidate()时,渲染性能会降低。

我做错了什么吗?有更好的实现方式吗?


“draw()”是将画布渲染到视图上的文档化方法。 - Simon
@Simon 我知道,但是draw()并没有以某种方式调用onDraw()。 - Bas
4个回答

3

我知道这不是最好的解决方案,但我使用了@SuppressLint("WrongCall")来避免错误消息。


使用Gradle:android { ...lintOptions { disable 'WrongCall' }}(我们有一些代码应该执行“错误”的调用。) - Sergey Galin

3
按照惯例,Android API 中名为 On*** 的方法不应该直接被您的代码调用,而只能由 Android 操作系统本身调用。我希望有人告诉您在这种情况下使用什么替代方法...
关于性能:如果性能可能成为问题,为什么不使用 OpenGL?(或使用 OpenGL 的库)

谢谢提供的信息。我使用Canvas而不是OpenGL的原因是这实际上是为游戏引擎设计的,由于外部因素的影响,渲染需要尽可能简单。 - Bas
这并不是为了专业使用而设计的,而是让几乎没有编程经验的人看到如何在屏幕上显示简单对象并以自己的方式操纵(覆盖)它。OpenGL对此来说只是杀鸡焉用牛刀。 - Bas
@Bas那么为什么要用Android呢?它不适合没有编程经验的人,有更简单的东西。例如,对于绘图来说最容易入门且功能强大的是Cairo。 - Display Name
2
抱歉,我的表述不太准确。这是给那些已经对Java(如渲染)有一定了解并想要尝试Android的人们准备的。我们只是提供了一些基础知识,让他们可以进一步构建自己的项目。为什么不介绍他们学习OpenGL?因为OpenGL比Canvas更难理解,特别是对于没有太多经验的人来说。如果他们愿意,以后可以使用OpenGL。 - Bas

2

不要使用onDraw(c),而是使用draw(c),并将方法onDraw(Canvas canvas)更改为draw(Canvas canvas)。希望这可以帮到你。


0

我遇到了相同的错误。在将onDraw函数更改为另一个名称(例如Fix_onDraw)之后,一切都正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接