Как анимация 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