2012-10-03 3 views
2

Fondamentalement, j'ai le bitmap suivant: Nuage de bitmap; cloud = BitmapFactory.decodeResource (getResources(), R.drawable.cloud); Ce que je veux faire est dessiner le même bitmap (dans ce cas le nuage) plusieurs fois dans différents endroits (aléatoires) sur le canevas. Je veux faire cela dans la méthode OnDraw de mon point de vue.Dessiner plusieurs fois à partir d'un seul bitmap sur un canevas

Ainsi, le produit final devrait ressembler à ceci: http://puu.sh/1b4fe

Cependant

Voici le code pour dessiner le bitmap à plusieurs reprises sur la même toile:

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(); 
} 

Comme vous pouvez le voir , j'utilise aléatoire pour générer la position du bitmap, et chaque fois que le bitmap est dessiné dans un endroit différent sur le canevas.

Le seul problème est, à chaque fois que invalidate() est appelé, le dessin dans la boucle for se produit à nouveau. Pour cette raison, il semble que les dessins (nuage) se déplacent très rapidement partout.

Après avoir cherché pendant un certain temps, je l'ai trouvé à cette question: Draw multiple times from a single bitmap

Il est à peu près la même question que ma question, mais onfortunately il n'y a pas là bonne réponse.

Alors, comment puis-je archiver cela?

Merci!

Répondre

0

Le premier problème est que vous lisez dans le bitmap 10 fois par trame ce qui est complètement inutile. Vous devriez lire le bitmap en une fois lorsque vous instanciez votre classe. J'ai également ajouté une peinture. Je ne sais pas si c'est tout à fait nécessaire mais juste au cas où vous décidiez d'en faire plus dans votre méthode de tirage, c'est là.

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

Nous vous remercions de votre réponse, votre droit de lire le bitmap une fois. Mon erreur. Cependant, j'ai posé ma question dans le mauvais sens. Vous pouvez voir la question mise à jour dans le post d'ouverture. – MeesterPatat

+0

Tout d'abord, n'appelez pas invalider. Si vous cherchez quelque chose qui continue de dessiner aussi vite que possible, vous devriez utiliser 'SurfaceView'. Deuxièmement, la raison pour laquelle ils semblent se déplacer très rapidement partout est parce que vous obtenez un nouvel emplacement aléatoire à chaque image. Cela signifie qu'ils se déplacent très rapidement partout. Si vous voulez qu'ils restent immobiles, vous devez stocker l'emplacement de chaque cercle et utiliser cet emplacement pour les dessiner à chaque fois. – CaseyB

Questions connexes