Rotazione delle immagini manualmente può essere un po 'di dolore, ma ecco come ho fatto esso.
private void animateRotation(int degrees, float durationOfAnimation){
long startTime = SystemClock.elapsedRealtime();
long currentTime;
float elapsedRatio = 0;
Bitmap bufferBitmap = carBitmap;
Matrix matrix = new Matrix();
while (elapsedRatio < 1){
matrix.setRotate(elapsedRatio * degrees);
carBitmap = Bitmap.createBitmap(bufferBitmap, 0, 0, width, height, matrix, true);
//draw your canvas here using whatever method you've defined
currentTime = SystemClock.elapsedRealtime();
elapsedRatio = (currentTime - startTime)/durationOfAnimation;
}
// As elapsed ratio will never exactly equal 1, you have to manually draw the last frame
matrix = new Matrix();
matrix.setRotate(degrees);
carBitmap = Bitmap.createBitmap(bufferBitmap, 0, 0, width, height, matrix, true);
// draw the canvas again here as before
// And you can now set whatever other notification or action you wanted to do at the end of your animation
}
Questo ruoterà il vostro carBitmap a che cosa angolo specificato nel tempo specificato + il tempo per disegnare l'ultimo fotogramma. Tuttavia, c'è un problema. Ruota carBitmap senza regolare correttamente la sua posizione sullo schermo. A seconda di come stai disegnando i tuoi bitmap, potresti ritrovare la rotazione di carBitmap mentre l'angolo in alto a sinistra della bitmap rimane al suo posto. Mentre l'auto gira, la bitmap si allungherà e si adatterà per adattarsi alla nuova dimensione dell'auto, riempiendo gli spazi attorno ad essa con pixel trasparenti. È difficile descrivere come questo sarebbe guardare, ecco un esempio ruotare un quadrato:
L'area grigia rappresenta la piena del bitmap, ed è riempito con i pixel trasparenti. Per risolvere questo problema, è necessario utilizzare la trigonometria. È un po 'complicato ... se questo finisce per essere un problema per te (non so come stai disegnando i tuoi bitmap sulla tela così potrebbe non esserlo), e non riesci a trovare la soluzione, lascia lo so e posterò come l'ho fatto.
(Non so se questo è il modo più efficiente per farlo, ma funziona senza problemi finché la bitmap è inferiore a 300x300 o giù di lì. Forse se qualcuno sa meglio, potrebbero dirci!)
fonte
2010-03-13 18:47:48
È probabile che si verifichino problemi di prestazioni se si crea ripetutamente la bitmap. Invece, creala una volta e poi passa la tua matrice in 'canvas.drawBitmap()'. Inoltre, il ciclo while impedirà ad altro di animare fino al completamento del turno. Prova un loop di gioco: http://www.koonsolo.com/news/dewitters-gameloop/ – idbrii