2013-12-10 62 views
2

我正在开发一个android上的小型测试游戏。我使用SurfaceView在画布上绘图。SurfaceView不会重新粉刷

这是我的问题:只显示一帧,但listener.draw(..)被调用,因为它应该,所以我的游戏是静止图像

线程调用draw(..)每次迭代,但屏幕不更新。

public class GameView extends SurfaceView implements Runnable, SurfaceHolder.Callback { 
    // ... 

    @Override 
    protected void onDraw(Canvas canvas) { 
     if(alive) { // to prevent drawing if view exists but surface isn't created 
      // ... 

      final int savedState = canvas.save(); 

      try { 
       canvas.clipRect(leftPadding, topPadding, leftPadding + finalWidth, topPadding + finalHeight); 
       canvas.translate(leftPadding, topPadding); 
       canvas.scale(scaleFactor, scaleFactor); 

       if(listener != null) 
        listener.draw(this, canvas); 
      } finally { 
       canvas.restoreToCount(savedState); 
      } 
     } 
    } 

    // ... 

    @Override 
    public void run() { 
     alive = true; 

     while(alive) { 
      if(!holder.getSurface().isValid()) 
       continue; 

      long currentFrameStart = System.currentTimeMillis(); 
      deltaFrameTime = currentFrameStart - lastFrameStart; 
      lastFrameStart = currentFrameStart; 

      listener.update(this, deltaFrameTime); 

      Canvas canvas = null; 

      try { 
       canvas = holder.lockCanvas(); 

       synchronized(holder) { 
        draw(canvas); 
       } 
      } finally { 
       if(canvas != null) { 
        holder.unlockCanvasAndPost(canvas); 
       } 
      } 

      try { 
       Thread.sleep(10); 
      } catch(InterruptedException e) { 
       // ... 
      } 
     } 
    } 

    // ... 
} 

回答

3

谷歌搜索更多一些时间给我一个解决方案:

http://danielnadeau.blogspot.de/2012/01/android-canvas-beginners-tutorial.html

,而不是

try { 
    canvas = holder.lockCanvas(); 

    synchronized(holder) { 
     draw(canvas); 
    } 
} finally { 
    if(canvas != null) { 
     holder.unlockCanvasAndPost(canvas); 
    } 
} 

我现在用

try { 
    canvas = holder.lockCanvas(); 

    synchronized(holder) { 
     postInvalidate(); 
    } 
} finally { 
    if(canvas != null) { 
     holder.unlockCanvasAndPost(canvas); 
    } 
} 
+0

您好,我目前正在研究类似的东西,并且使用您的'postInvalidate()'解决方案来解决它,但我不确定如果使用它,您会“要求”Android框架重新绘制视图。这不是我正在寻找的东西(我需要快速重绘),因此我使用了'onDraw()'方法,但它没有吸引我......我越来越绝望,我真的不知道在哪里因为'onDraw()'里面的代码已经运行了,但是结果似乎没有被“渲染”:l – JorgeGRC

+0

@ Jorge33212我不记得了,但我认为那是我的问题。我在Android开发方面并不是很有经验,所以只有一点机会我可以帮忙,对不起。 – kelunik

+0

只好试试看:P。反正谢谢你的回复:) – JorgeGRC