Wie dreht man eine bitmap in Android über Bilder center reibungslos und ohne oszillierende Bewegung
Ich möchten drehen Sie ein bitmap-Bild basierend auf Benutzer, klicken Sie auf um 10 Grad. Nach zahlreichen stackoverflow und google Antworten, ich habe versucht, verschiedene Kombinationen von Matrix-rotation.
Jedoch das Bild nicht wirklich drehen, wie erwartet und gibt einen nervösen Blick auf rotation + Schwingung über die Leinwand-center. Zum testen bin ich zunehmenden Drehwinkel von 10 ° (statt Klicks) jedes mal, wenn Objekt die draw-Methode aufgerufen wird. Das Bild ist ein symmetrischer Kreis [64x64 umschließenden Rechteck] und ich erwarte, dass es zu drehen in der Mitte des Bildschirms über die eigene Mitte, wie ein Rad, aber es dreht sich und bewegt sich Diagonal nach rechts-unten und bewegt sich zurück bis zu der Mitte des Bildschirms in eine Oszillation.
public void draw(Canvas canvas) {
Matrix matrix = new Matrix();
rotation += 10;
float px = this.viewWidth/2;
float py = this.viewHeight/2;
matrix.setRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2);
Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, getImgWidth(), getImgHeight(), matrix, true);
canvas.drawBitmap(newbmp, px - (getImgWidth()/2), py - (getImgHeight()/2), null);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel.
Ich brach es auf 3 Stufen.
Der erste übersetzen verschiebt die bitmap, so dass es die Mitte ist bei 0,0
Dann eine Drehung,
und schließlich bewegen Sie die bitmap-center, wo Sie wollen es auf die Leinwand.
Sie brauchen nicht die zweite bitmap.
Als Optimierung, erstellen Sie die Matrix einmal außerhalb dieser Methode, und ersetzen Sie die Kreation mit einem Aufruf
matrix.reset()
matrix.setRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2);
anstelle der ersten beiden post* Methoden.matrix.postTranslate(px, py, centerx, centery)
.Müssen Sie übersetzen die bitmap in den 0,0-Punkt (oder zeichnen Sie es auf 0,0), und drehen Sie es dort, dann übersetzen Sie zurück, wie Z:
Hier ziehe ich es mit dem center auf 0,0 (denke ich), denn wenn man sich dreht, es geht um 0,0 und nicht die Mitte des Bildschirms, wie man denken würde. Wenn Sie zeichnen das Zentrum zu 0,0 dann es dreht sich um den Mittelpunkt der bitmap.
Wenn mein code nicht erreichen, zeichnen der bitmap-center bei 0,0, dann Sie können ändern, mein code um es zu zeichnen, in der Mitte und es wird so funktionieren, wie Sie wollen.
Hoffe, das hilft!
getImgWidth()/2
undgetImgHeight()/2
statt der Ansicht Dimensionen.Die Schritte sind