【问题标题】:How to redraw Canvas partially?如何部分重绘画布?
【发布时间】:2013-08-26 04:27:57
【问题描述】:

我是新手。我使用 Canvas 制作了一个简单的游戏。我在 onDraw() 方法中编写了几乎所有的代码,那里有很多计算。在我的代码中 onDraw() 的末尾有一个 invalidate() 方法。这就是我调用重绘视图的方式。如何仅重绘 Canvas 的一部分?主要问题是我在 onDraw() 中有很多计算,它会减慢整个游戏的速度。我尝试使用像这里这样的位图:

creating a bitmap - stackOverflow

但它并没有解决问题,因为创建位图的过程太慢了。使用 SurfaceHolder 和 Callback 是个好主意吗?我尝试使用它,但我不知道这是否是做我想做的事情的正确方法。有谁能够帮我?如何仅部分重绘我的视图以停止始终通过新计算重绘所选元素(从保存状态绘制它们)?我只想在需要时重绘整个视图。如果有人发布可以解决此问题的代码(甚至可以是两个矩形),那就太好了。

【问题讨论】:

  • 首先,您不应该在onDraw 内进行大量计算或内存分配。它们必须在 invalidate 被调用之前完成。您可以添加一个执行这些计算的新线程。在他们完成调用 postInvalidate(); 之后。并且不要自己调用onDrawinvalidatepostInvalidate 自己调用。

标签: android android-canvas ondraw invalidation surfaceholder


【解决方案1】:

使用相同的位图而不是创建新的位图,并调用invalidate with a rectangle(或带边界)作为其参数。

在onDraw中,你可以调用canvas.getClipBounds()来找到要删除的矩形。

另外,为了改进您的代码,请尽量避免在 onDraw 方法上创建新对象。

事实上,如果这是一款重度游戏,请考虑使用 openGL。为简单起见,您可以使用第三方库,例如 libGDX 或 AndEngine。

【讨论】:

    【解决方案2】:

    尝试在 Class 方法中创建位图并从 onDraw() 调用它们。

       public class DrawView extends View {
    
             public DrawView(Context context, AttributeSet attributeSet) {
             super.DrawView(context attributeSet)
              //Create your bitmaps in here
             }
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多