Поворот изображений вручную может быть немного болезненным, но вот как я это сделал.
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
}
Это повернет ваш carBitmap на любой угол, который вы укажете в указанное время + время рисования последнего кадра. Однако здесь есть одна загвоздка. Это вращает ваш carBitmap без правильной настройки его положения на экране. В зависимости от того, как вы рисуете свои растровые изображения, вы можете закончить вращением вашего carBitmap, в то время как верхний левый угол растрового изображения остается на месте. По мере вращения автомобиля растровое изображение будет растягиваться и корректироваться в соответствии с новым размером автомобиля, заполняя промежутки вокруг него прозрачными пикселями. Трудно описать, как это будет выглядеть, вот пример поворота квадрата:
Серая область представляет полный размер растрового изображения и заполнена прозрачными пикселями. Чтобы решить эту проблему, вам нужно использовать тригонометрию. Это немного сложно ... если это в конечном итоге станет для вас проблемой (я не знаю, как вы рисуете свои растровые изображения на холсте, чтобы этого не было), и вы не можете найти решение, Я знаю, и я опубликую, как я это сделал.
(Я не знаю, является ли это наиболее эффективным способом сделать это, но он работает для меня плавно, пока растровое изображение меньше, чем 300x300 или около того. Возможно, если кто-то знает о лучшем способе, они могли бы сказать, нам!)