83 votes

Android: comment faire pivoter une image sur un point central

J'ai été à la recherche pour plus d'un jour pour une solution à ce problème mais rien n'y fait, même les réponses ici. La Documentation n'explique pas quelque chose de trop.

Je suis simplement essayer d'obtenir une rotation dans la direction d'un autre objet. Le problème est que l'image n'est pas mis en rotation autour d'un point fixe, mais plutôt autour de la bitmaps (0,0).

Voici le code, je vais avoir des ennuis avec:

  Matrix mtx = new Matrix();
  mtx.reset();
  mtx.preTranslate(-centerX, -centerY);
  mtx.setRotate((float)direction, -centerX, -centerY);
  mtx.postTranslate(pivotX, pivotY);
  Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, spriteWidth, spriteHeight, mtx, true);
  this.bitmap = rotatedBMP;

Ce qui est étrange, c'est qu'il n'a pas d'importance comment je change les valeurs dans pre/postTranslate() et les arguments de type float en setRotation(). Quelqu'un peut s'il vous plaît aider et de me pousser dans la bonne direction? :)

101voto

Sudar Nimalan Points 1956

J'espère que la séquence de code suivante vous aidera:

 Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config);
Canvas canvas = new Canvas(targetBitmap);
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
canvas.drawBitmap(source, matrix, new Paint());
 

Si vous vérifiez la méthode suivante de ~frameworks\base\graphics\java\android\graphics\Bitmap.java

 public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height,
        Matrix m, boolean filter)
 

cela expliquerait ce qu'il fait avec rotation et traduire.

78voto

Arvis Points 1945

Edité : code optimisé.

 public static Bitmap RotateBitmap(Bitmap source, float angle)
{
      Matrix matrix = new Matrix();
      matrix.postRotate(angle);
      return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
 

Pour obtenir du bitmap à partir de ressources:

 Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
 

25voto

Ste Points 149

Je suis revenue à ce problème maintenant que nous sommes en train de finaliser le jeu et j'ai juste pensé à poster ce qui a fonctionné pour moi.

C'est la méthode de la rotation de la Matrice:

this.matrix.reset();
this.matrix.setTranslate(this.floatXpos, this.floatYpos);
this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY()); 

(this.getCenterX() est fondamentalement les images de la position X + les bitmaps largeur / 2)

Et la méthode de Dessin de l'image (appelée par un RenderManager de la Classe):

canvas.drawBitmap(this.bitmap, this.matrix, null);

C'est donc prettey tout droit vers l'avant, mais je trouve qu'il abit étrange que je ne pouvais pas le faire fonctionner en setRotate suivie par postTranslate. Peut-être que certains ne sait pourquoi cela ne fonctionne pas? Maintenant, tous les bitmaps tourner correctement, mais il n'est pas sans une légère baisse bitmap de la qualité :/

En tout cas, merci pour votre aide!

7voto

Macarse Points 36519

Vous pouvez également faire pivoter les ImageView utilisant un RotateAnimation :

 RotateAnimation rotateAnimation = new RotateAnimation(from, to,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration(ANIMATION_DURATION);
rotateAnimation.setFillAfter(true);

imageView.startAnimation(rotateAnimation);
 

5voto

Sudar Nimalan Points 1956

Vous pouvez utiliser quelque chose comme suit:

 
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
matrix.mapRect(rectF);
Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config);
Canvas canvas = new Canvas(targetBitmap);
canvas.drawBitmap(source, matrix, new Paint());
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X