2013-08-25 77 views
0

我是新手。我使用Canvas製作了一個簡單的遊戲。我在onDraw()方法中寫了幾乎所有的代碼,並且有很多計算。在我的代碼中,在onDraw()的最後有一個invalidate()方法。這就是我打電話重畫我的觀點的方式。我怎樣才能重畫只有一部分畫布?主要的問題是我在onDraw()裏面進行了大量的計算,並且減慢了整個遊戲的速度。我試圖用位圖喜歡這裏:如何重繪部分Canvas?

creating a bitmap - stackOverflow

但因爲建立一個位圖太慢過程中它並沒有解決問題。使用SurfaceHolder和Callback是一個好主意嗎?我試圖使用它,但我不知道這是否是正確的方式來做我想做的事情。有誰能夠幫助我?如何重新繪製我的視圖只是部分停止選擇的元素總是通過新計算重繪(從保存狀態中繪製)?我只想在需要時重繪整個視圖。如果有人發佈能夠解決這個問題的代碼(甚至可以是兩個矩形),那將會很棒。

+0

首先,你不應該在'onDraw'內執行大量的計算或內存分配。它們必須在調用invalidate之前完成。您可以添加一個執行這些計算的新線程。並在他們完成後調用postInvalidate();.並且不要自己調用'onDraw','invalidate'或'postInvalidate'自己做。 – Mikhail

回答

1

使用相同的位圖,而不是創建一個新的,並調用invalidate with a rectangle(或邊界)作爲它的參數。

中的onDraw

,你可以調用canvas.getClipBounds(),以便找到矩形以invlidate。

也,以提高你的代碼,儘量避免上的onDraw方法創建新的對象。實際上,如果它是一個沉重的遊戲,可以考慮使用openGL來代替。爲簡單起見,您可以使用第三方庫,如libGDX或AndEngine。

1

嘗試在類方法創建位圖和從的onDraw調用它們()。

public class DrawView extends View { 

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