Поворот изображений вручную может быть немного боли, но вот как я сделал Это.
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, в то время как верхний левый угол растрового изображения остается на месте. По мере поворота автомобиля растровое изображение будет растягиваться и регулироваться в соответствии с новым размером автомобиля, заполняя пробелы вокруг него прозрачными пикселями. Трудно описать, как это будет выглядеть, так вот пример вращающийся квадрат:
Серая зона представляет собой полный размер битовой карты, и наполнен прозрачными пикселями. Чтобы решить эту проблему, вам нужно использовать тригонометрию. Это немного сложно ... если это будет проблемой для вас (я не знаю, как вы рисуете свои растровые изображения на холсте, чтобы это могло быть не так), и вы не можете решить решение, пусть я знаю, и я опубликую, как я это сделал.
(Я не знаю, является ли это наиболее эффективным способом его выполнения, но он работает плавно для меня, пока растровое изображение меньше 300 × 300 или около того. Возможно, если кто-то знает о лучшем способе, они могут сообщите нам!)
Возможно, вы столкнетесь с проблемами производительности, если вы неоднократно создаете растровое изображение. Вместо этого создайте его один раз, а затем передайте свою матрицу в 'canvas.drawBitmap()'. Кроме того, этот цикл while предотвратит анимацию анимации до завершения вашего хода. Попробуйте игровой цикл: http://www.koonsolo.com/news/dewitters-gameloop/ – idbrii