2013-12-10 63 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