Как анимация Android работает под капотом?
В течение последних нескольких месяцев я построил движок twiving с открытым исходным кодом на Java (Universal Tween Engine), чтобы иметь возможность легко добавлять плавные анимации и переходы на мои Андроид игры. Он работает как бриз для игр и успешно используется многими людьми (в основном в сообществе LibGDX). Библиотека является общей и может использоваться для анимации всего (компоненты Swing UI, объекты игры opengl и т.д.). Теперь я хочу создать аддон в lib, посвященный пользовательским интерфейсам Android, поскольку я считаю, что он может значительно облегчить создание очень сложных анимаций по сравнению со встроенной средой анимации.
My lib предоставляет метод .update(float deltaTime)
, который нужно вызывать каждый раз, когда вы хотите обновить все запущенные анимации. Он был адаптирован для игр, поскольку каждая игра предоставляет бесконечный цикл, но это не относится к пользовательским интерфейсам.
Поэтому мне было интересно, как анимационная среда Android API работает под капотом. Есть ли статический поток, посвященный анимации, который работает непрерывно и обновляет анимацию по кадру и приостанавливается до тех пор, пока не будет запущена новая анимация?
Я думал о чем-то вроде который, но я не очень доволен этим кодом, так как он не учитывает частоту обновления устройства.
Ответы
Ответ 1
Хорошее место для начала - взглянуть на то, как система просмотра Android реализует ее. Радость с открытым исходным кодом.
Когда вы вызываете .animate() в представлении, вы возвращаете ViewPropertyAnimator, который после startAnimation() запускает ValueAnimator.
У ValueAnimator есть обработчик, который управляет циклом.
https://github.com/CyanogenMod/android_frameworks_base/blob/ics/core/java/android/view/ViewPropertyAnimator.java
https://github.com/CyanogenMod/android_frameworks_base/blob/ics/core/java/android/animation/ValueAnimator.java