Анимация в Skija
"Анимация" в Skija может означать три разных вещи в зависимости от того, чего вы хотите достичь:
- Программная анимация: Перемещение фигур или изменение цветов с помощью кода (например, игровой цикл).
- Lottie (Skottie): Воспроизведение высококачественных векторных анимаций, экспортированных из After Effects.
- Анимированные изображения: Воспроизведение GIF или WebP изображений.
1. Программная анимация ("Игровой цикл")
Skija — это рендерер в "немедленном режиме". Это означает, что он не запоминает, где вы нарисовали круг вчера. Чтобы переместить круг, вы просто рисуете его в другом месте сегодня.
Для создания анимации вы полагаетесь на вашу оконную библиотеку (например, JWM или LWJGL), которая будет многократно вызывать вашу функцию draw.
Паттерн
- Получить время: Используйте
System.nanoTime()для получения текущего времени. - Рассчитать состояние: Определите, где должны находиться ваши объекты, основываясь на времени.
- Нарисовать: Отрендерить кадр.
- Запросить следующий кадр: Сказать окну обновиться снова немедленно.
Пример: Движущийся круг
// Переменная для хранения состояния
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), чтобы предотвратить разрывы изображения.