images en rotation peuvent manuellement être un peu d'une douleur, mais voici comment je l'ai fait il.
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
}
Cela tournera votre carBitmap à quelque angle que vous spécifiez dans le temps spécifié + le temps de dessiner la dernière image. Cependant, il y a un hic. Ceci fait tourner votre carBitmap sans ajuster correctement sa position sur l'écran. Selon la façon dont vous dessinez vos bitmaps, vous pourriez vous retrouver avec votre carBitmap tournant alors que le coin supérieur gauche de l'image bitmap reste en place. Au fur et à mesure que la voiture tourne, l'image bitmap s'étire et s'ajuste pour s'adapter à la nouvelle taille de la voiture, en remplissant les espaces autour de celle-ci avec des pixels transparents. Il est difficile de décrire comment cela ressemblerait, voici donc un exemple de rotation un carré:
La zone grise représente la taille totale du bitmap, et est rempli de pixels transparents. Pour résoudre ce problème, vous devez utiliser la trigonométrie. C'est un peu compliqué ... si cela finit par être un problème pour vous (je ne sais pas comment vous dessinez vos bitmaps sur la toile, ce n'est peut-être pas le cas), et vous ne pouvez pas trouver la solution, laissez Je sais et je posterai comment je l'ai fait.
(Je ne sais pas si c'est la façon la plus efficace de le faire, mais cela fonctionne bien pour moi tant que l'image bitmap est inférieure à 300x300 ou si. Peut-être que si quelqu'un sait d'une meilleure façon, ils pourraient Dites-nous!)
Vous risquez de rencontrer des problèmes de performances si vous créez plusieurs fois votre bitmap. Au lieu de cela, créez-le une fois, puis passez votre matrice dans 'canvas.drawBitmap()'. En outre, cette boucle empêchera toute autre chose d'animer jusqu'à ce que votre tour se termine. Essayez une boucle de jeu: http://www.koonsolo.com/news/dewitters-gameloop/ – idbrii