Je cherchais depuis plus d'un jour une solution à ce problème mais rien n'y fait, même les réponses ici. La documentation n'explique rien non plus.
J'essaie simplement d'obtenir une rotation dans la direction d'un autre objet. Le problème est que le bitmap ne pivote pas autour d'un point fixe, mais plutôt autour des bitmaps (0,0).
Voici le code avec lequel je rencontre des problèmes:
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;
La partie étrange est que peu importe comment je change les valeurs dans pre
/ postTranslate()
et les arguments float dans setRotation()
. Quelqu'un peut-il s'il vous plaît m'aider et me pousser dans la bonne direction? :)
new
matrice fraîchement éditée. C'est déjà l'identité.Réponses:
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 cochez la méthode suivante
~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 la rotation et la traduction.
la source
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 Bitmap à partir des ressources:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
la source
Je suis revenu sur ce problème maintenant que nous sommes en train de finaliser le jeu et j'ai juste pensé poster ce qui fonctionnait pour moi.
Voici la méthode de 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 essentiellement la position X des bitmaps + la largeur des bitmaps / 2)Et la méthode pour dessiner le bitmap (appelé via une
RenderManager
classe):canvas.drawBitmap(this.bitmap, this.matrix, null);
C'est donc simple mais je trouve un peu étrange que je ne puisse pas le faire fonctionner,
setRotate
suivi depostTranslate
. Peut-être que certains savent pourquoi cela ne fonctionne pas? Maintenant, tous les bitmaps tournent correctement mais ce n'est pas sans une légère diminution de la qualité du bitmap: /Quoi qu'il en soit, merci pour votre aide!
la source
Vous pouvez également faire pivoter le en
ImageView
utilisantRotateAnimation
: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);
la source
Vous pouvez utiliser quelque chose comme suivant:
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());
la source
Regardez l'échantillon de Google appelé Lunar Lander, l'image du navire y est tournée de manière dynamique.
Exemple de code Lunar Lander
la source
J'ai utilisé ces configurations et j'ai toujours le problème de la pixellisation:
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin); Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()), (bmpOriginal.getHeight()), Bitmap.Config.ARGB_8888); Paint p = new Paint(); p.setAntiAlias(true); Matrix matrix = new Matrix(); matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2), (float)(bmpOriginal.getHeight()/2)); RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight()); matrix.mapRect(rectF); targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888); Canvas tempCanvas = new Canvas(targetBitmap); tempCanvas.drawBitmap(bmpOriginal, matrix, p);
la source
matrix.reset(); matrix.setTranslate( anchor.x, anchor.y ); matrix.postRotate((float) rotation , 0,0); matrix.postTranslate(positionOfAnchor.x, positionOfAnchor.x); c.drawBitmap(bitmap, matrix, null);
la source