Rotación de imágenes de forma manual puede ser un poco de dolor, pero así es como he hecho eso.
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
}
Esto hará girar su carBitmap a cualquier ángulo que se especifique en el tiempo especificado + el momento de sacar el último fotograma. Sin embargo, hay una trampa. Esto rota tu carBitmap sin ajustar adecuadamente su posición en la pantalla. Dependiendo de cómo esté dibujando sus mapas de bits, podría terminar con su carBitmap girando mientras la esquina superior izquierda del mapa de bits permanece en su lugar. A medida que el automóvil gira, el mapa de bits se estirará y se ajustará para adaptarse al nuevo tamaño del automóvil, llenando los espacios a su alrededor con píxeles transparentes. Es difícil describir cómo se vería, así que aquí tiene un ejemplo que gira un cuadrado:
El área gris representa el tamaño del mapa de bits, y está lleno de píxeles transparentes. Para resolver este problema, debe usar la trigonometría. Es un poco complicado ... si esto termina siendo un problema para ti (no sé cómo estás dibujando tus mapas de bits en el lienzo por lo que podría no serlo), y no puedes resolver la solución, deja que Yo sé y publicaré cómo lo hice.
(No sé si esta es la forma más eficiente de hacerlo, pero funciona bien para mí siempre que el mapa de bits sea menor de 300x300. Tal vez si alguien sabe de una mejor manera, podrían ¡díganos!)
Es probable que encuentre problemas de rendimiento si crea repetidamente su mapa de bits. En cambio, créelo una vez y luego pase su matriz a 'canvas.drawBitmap()'. Además, ese bucle while impedirá que se active nada más hasta que se complete su turno. Pruebe un bucle de juego: http://www.koonsolo.com/news/dewitters-gameloop/ – idbrii