2010-12-14 4 views
3

Je voudrais "décaler" un bitmap d'un certain décalage x et y. Par shift, je veux dire, si j'ai un bitmap de 300x500, et que je le décalque par un décalage de -50, je m'attendrais à ce que chaque pixel monte de 50 pixels, et un rectangle de 300x50 pixels soit vide, au bas du bitmap . Le code ci-dessous fonctionne très bien si shiftX et shiftY sont négatifs, mais ne fonctionne pas du tout pour les valeurs positives. Je ne sais pas pourquoi?Android: comment déplacer un bitmap?

Rect srcRect = new Rect(-shiftX, -shiftY, mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(shiftX, shiftY); 

Canvas bitmapCanvas = new Canvas(mBitmap); 
bitmapCanvas.drawBitmap(mBitmap, srcRect, destRect, null); 

J'ai essayé plusieurs versions différentes de cela. Il semble que tenter de traduire un bitmap avec un y positif produit toujours des ordures. Dans cet exemple simple, un Shifty négatif donne le comportement attendu, mais un Shifty positif donne un résultat des ordures:

Canvas bitmapCanvas = new Canvas(mBitmap); 
bitmapCanvas.drawBitmap(mBitmap, 0, shiftY, null); 

* Mise à jour. Ceci est résolu par le code ci-dessous. Cependant, ceci n'est pas efficace en mémoire. Des suggestions pour une meilleure solution?

Canvas bitmapCanvas = new Canvas(mBitmap); 
Bitmap tempBitmap = mBitmap.copy(CONFIG.ARGB_8888, false); 
bitmapCanvas.drawBitmap(tempBitmap, 0, shiftY, null); 
+0

'ne signifie pas work' quoi exactement? Qu'est ce que tu obtiens? – WarrenFaith

+0

produit un résultat apparemment vide – ab11

+0

pourquoi créez-vous un nouveau canevas? – WarrenFaith

Répondre

0

Je ne peux pas reproduire ceci avec votre code. Je l'ai essayé avec un décalage de 50 et -50 et les deux fonctionnent comme prévu.

Mon code dans la méthode de dessin:

// negative value: -50 
Rect srcRect = new Rect(-(-50), -(-50), mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(-50, -50); 

canvas.drawBitmap(mBitmap, srcRect, destRect, null); 

ou positif:

// positive value: 50 
Rect srcRect = new Rect(-50, -50, mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(50, 50); 

canvas.drawBitmap(mBitmap, srcRect, destRect, null); 
+0

lorsque vous dessinez avec la valeur positive, avez-vous déjà initialisé le bitmap pour avoir du contenu? Je pense que le problème est d'essayer d'écraser les pixels qui ont déjà été écrits. – ab11

+0

La méthode drawBitmap avec le rect lit les pixels du bitmap et les dessine sur le destRect, donc il ne devrait pas y avoir de problème de pixel déjà écrit. Pouvez-vous fournir un peu plus de code? – WarrenFaith

+0

J'ai mis à jour avec une solution qui fonctionne. Parce que cette solution fonctionne, je pense que le problème est que lorsque j'essaie de revenir dans un bitmap, il dessine sur un pixel qui doit ensuite être lu plus tard, ce qui n'est pas un problème si je dessine dans la direction opposée. Ma solution est mauvaise, car elle crée une deuxième bitmap, ce qui double l'utilisation de la mémoire. – ab11

0

solution simple ...

canvas.translate(dx, dy); 

canvas.draw....(); 
Questions connexes