2012-10-03 33 views
2

基本上我有以下位圖: 位圖雲; cloud = BitmapFactory.decodeResource(getResources(),R.drawable.cloud);從畫布上的單個位圖繪製多次

我想要做的是在畫布上的不同(隨機)位置繪製相同的位圖(在這種情況下,雲)多次。我想在我的視圖的OnDraw方法中執行此操作。

所以最終產品應該是這樣的: http://puu.sh/1b4fe

然而

這是同一個畫布上多次繪製位圖代碼:

protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.onDraw(canvas); 

    // canvas.drawColor(Color.BLUE); 
    //drawBackground(canvas); 

    //objectMovement(canvas); 

    for (int i = 0; i < 500; i += 50) { 
     canvas.drawBitmap(cloud, 50 + rand.nextInt(350), 
       10 + rand.nextInt(350), null); 
    } 

    invalidate(); 
} 

正如你所看到的,我使用隨機生成位圖的位置,並且每次位圖都在畫布上的不同位置繪製。

唯一的問題是,每次調用invalidate()時,for循環中的圖形都會再次發生。正因爲如此,看起來圖紙(雲)在整個地方移動得非常快。

搜索一段時間後,我發現這個問題: Draw multiple times from a single bitmap

這幾乎是我的問題,同樣的問題,但onfortunately有就是有沒有正確的答案。

那麼,我該如何實現這一目標呢?

謝謝!

回答

0

第一個問題是,您正在讀取每幀10次的位圖,這是完全不必要的。實例化類時,您應該只讀一次位圖。我還添加了一個Paint。我不知道這是否完全有必要,但只要你決定在你的繪畫方法中做更多的事情就行了。

public class MyView extends View 
{ 
    private Bitmap _cloud; 
    private Paint _paint; 

    public MyView(Context context) 
    { 
     super(context); 
     _cloud = BitmapFactory.decodeResource(getResources(),R.drawable.cloud); 
     _paint = new Paint(); 
    } 

    protected void onDraw(Canvas canvas) 
    { 
     for(int i = 0; i < 500; i += 50) 
     { 
      canvas.drawBitmap(_cloud, 50 + rand.nextInt(350rand.nextInt(350)), 10 + i, _paint); 
     } 
    } 
} 
+0

感謝您的回答,您有關閱讀位圖一次的權利。我的錯。然而,我問我的問題是錯誤的。您可以在開始的帖子中看到更新的問題。 – MeesterPatat

+0

首先,不要稱無效。如果您正在尋找能夠儘可能快地繪製圖形的東西,則應該使用「SurfaceView」。其次,他們看起來像在整個地方移動速度非常快的原因是因爲您每幀都會得到一個新的隨機位置。這意味着他們在整個地方移動得非常快。如果你想讓它們保持靜止,那麼你需要存儲每個圓圈的位置,並使用該位置每次繪製它們。 – CaseyB