【问题标题】:Android onDraw() is a suspicous method callAndroid onDraw() 是一个可疑的方法调用
【发布时间】:2013-10-01 19:28:22
【问题描述】:

对于 Android 画布游戏,我使用以下(最小化)方法请求重绘 SurfaceView:

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

但自从上一个 android sdk (22.2.1) 以来,它在 surfaceView.onDraw

上给了我一个 Lint 警告

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

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

我做错了什么吗?有没有更好的方法来实现这一点?

【问题讨论】:

标签: android performance android-canvas android-view


【解决方案1】:

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

【讨论】:

  • 感谢您的信息。我使用canvas而不是OpenGL的原因是这实际上是针对游戏引擎的,并且由于外部因素,渲染需要尽可能简单。
  • 它不是为专业用途而设计的,而是让几乎没有编程经验的人了解如何在屏幕上显示简单的对象并以他们自己的方式操作(覆盖)它。 OpenGL 只是过大了。
  • @Bas 那么为什么要使用 Android 呢?它不适合没有编程经验的人,有更容易的事情。例如,绘画最简单但最强大的东西是开罗。
  • 对不起,我说错了。它更适合已经对 java 有一些了解(如渲染)并想尝试 Android 的人。我们只是给他们一些基础,让他们可以进一步发展。为什么不将它们介绍给 OpenGL?因为 openGL 比 canvas 更难理解,特别是如果你没有太多经验的话。如果他们愿意,他们可以稍后使用 openGL。
【解决方案2】:

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

【讨论】:

  • With Gradle: android { ... lintOptions { disable 'WrongCall' } } (我们有一些代码应该执行“错误”调用。)
【解决方案3】:

使用 draw(c) 而不是 onDraw(c) 并将 Method onDraw(Canvas canvas) 更改为 draw(Canvas canvas) 。希望这会有所帮助

【讨论】:

    【解决方案4】:

    我遇到了同样的错误。在我将 onDraw 函数更改为另一个名称后,即。 Fix_onDraw,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多