Skip to content

Анимация в Skija

"Анимация" в Skija может означать три разных вещи в зависимости от того, чего вы хотите достичь:

  1. Программная анимация: Перемещение фигур или изменение цветов с помощью кода (например, игровой цикл).
  2. Lottie (Skottie): Воспроизведение высококачественных векторных анимаций, экспортированных из After Effects.
  3. Анимированные изображения: Воспроизведение GIF или WebP изображений.

1. Программная анимация ("Игровой цикл")

Skija — это рендерер в "немедленном режиме". Это означает, что он не запоминает, где вы нарисовали круг вчера. Чтобы переместить круг, вы просто рисуете его в другом месте сегодня.

Для создания анимации вы полагаетесь на вашу оконную библиотеку (например, JWM или LWJGL), которая будет многократно вызывать вашу функцию draw.

Паттерн

  1. Получить время: Используйте System.nanoTime() для получения текущего времени.
  2. Рассчитать состояние: Определите, где должны находиться ваши объекты, основываясь на времени.
  3. Нарисовать: Отрендерить кадр.
  4. Запросить следующий кадр: Сказать окну обновиться снова немедленно.

Пример: Движущийся круг

java
// Переменная для хранения состояния
long startTime = System.nanoTime();

public void onPaint(Canvas canvas) {
    // 1. Рассчитать прогресс (от 0.0 до 1.0) на основе времени
    long now = System.nanoTime();
    float time = (now - startTime) / 1e9f; // Время в секундах
    
    // Движение на 100 пикселей в секунду
    float x = 50 + (time * 100) % 500; 
    float y = 100 + (float) Math.sin(time * 5) * 50; // Покачивание вверх-вниз

    // 2. Нарисовать
    Paint paint = new Paint().setColor(0xFFFF0000); // Красный
    canvas.drawCircle(x, y, 20, paint);

    // 3. Запросить следующий кадр (метод зависит от вашей оконной библиотеки)
    window.requestFrame(); 
}

2. Анимации Lottie (Skottie)

Для сложных векторных анимаций (например, индикаторов загрузки UI, иконок) Skija использует модуль Skottie. Это гораздо эффективнее, чем рисовать всё вручную.

Смотрите Справочник по API анимации для подробностей о том, как загружать и управлять файлами Lottie.

3. Анимированные изображения (GIF / WebP)

Для воспроизведения стандартных форматов анимированных изображений, таких как GIF или WebP, используйте класс Codec для извлечения кадров.

Смотрите Справочник по API Codec для подробностей о декодировании и воспроизведении много-кадровых изображений.


Советы по производительности

  • Не создавайте объекты в цикле: Переиспользуйте объекты Paint, Rect и Path. Создание новых Java-объектов 60 раз в секунду запускает Сборщик Мусора и вызывает подтормаживания.
  • Используйте saveLayer осторожно: Это дорогая операция.
  • V-Sync: Убедитесь, что в вашей оконной библиотеке включена вертикальная синхронизация (V-Sync), чтобы предотвратить разрывы изображения.