Анимация и вращение изображения в Поверхностном Представлении

Я хотел бы анимировать перемещение на SurfaceView. Идеально я хотел бы также быть уведомленным, после того как анимация закончилась.

Например: у Меня могло бы быть автомобильное направление на север. Если я хотел анимировать его так, чтобы это стояло перед Югом в течение 500 мс, как я мог сделать это?

Я использую SurfaceView, таким образом, вся анимация должна быть обработана вручную, я не думаю, что могу использовать XML или классы android Animator.

Кроме того, я хотел бы знать лучший способ анимировать что-то непрерывно в SurfaceView (т.е. цикл обхода)

8
задан jax 13 March 2010 в 17:38
поделиться

1 ответ

Поворот изображений вручную может быть немного хлопотным, но вот как я это сделал.

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, в то время как левый верхний угол растрового изображения остается на месте. При вращении автомобиля растровая карта будет растягиваться и подстраиваться под новый размер автомобиля, заполняя промежутки вокруг него прозрачными пикселями. Трудно описать, как это будет выглядеть, поэтому вот пример вращения квадрата:

alt text

Серая область представляет собой полный размер растровой карты и заполнена прозрачными пикселями. Чтобы решить эту проблему, необходимо использовать тригонометрию. Это немного сложно... если это окажется проблемой для вас (я не знаю, как вы рисуете свои растровые изображения на холсте, так что это может и не быть проблемой), и вы не сможете найти решение, дайте мне знать, и я напишу, как я это сделал.

(Я не знаю, является ли этот способ самым эффективным, но у меня он работает гладко до тех пор, пока размер растрового изображения не превышает 300x300 или около того. Возможно, если кто-то знает лучший способ, он может рассказать нам!)

.
8
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: