PostInvalidateOnAnimation против postInvalidate

Вопрос в том, когда следует использовать postInvalidateOnAnimation() над postInvalidate()?

Док говорит о postInvalidateOnAnimation(): Cause an invalidate to happen on the next animation time step, typically the next display frame. Но какой следующий этап анимации времени/следующий кадр отображения? Когда он будет называться?

Ответ 1

Я озадачился анимационным сбоем и наткнулся на этот вопрос. Попробовал ответить ниже:

Что представляет собой следующий кадр отображения?

Это когда обрабатываются все чертежи, макеты и входы.

Концепция вертикальной синхронизации (VSync) используется в классе хореографов после Android 4.1. Это сигнал, который традиционно отправляется с аппаратного обеспечения, чтобы сказать, что экран готов к перепроектированию. (Он возникает в катодных лучах). Обычно это около 60 Гц на мониторах.

Хореограф - это цикл обработки сообщений потоков пользовательских интерфейсов. На каждом VSync обрабатываются сообщения пользовательского интерфейса. Эти сообщения будут обрабатывать входы и перерисовывать дисплей. (Хореограф также будет делать другие вещи, такие как пропускание кадров, если пользовательский интерфейс работает слишком медленно - это общее сообщение на консоли отладки!)

Эта обработка цикла сообщений представляет собой кадр. Когда он будет называться - каждые 1/60 секунды в секунду с частотой кадров 60 Гц.

Этот видео из Google I/O 2012 более подробно описывается этот vsync и хореограф.

В чем разница между postInvalidateOnAnimation() над postInvalidate()?

Если требуется гладкая анимация, используйте postInvalidateOnAnimation, когда требуется перерисовать, используйте postInvalidate().

Рассуждение:

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

и нашел это в doFrame()

doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);

postInvalidateOnAnimation поместит обратный вызов в обратные вызовы анимации, а postInvalidate будет помещен в обратные вызовы обхода.

Ключевое различие для меня заключается в том, что обратные вызовы анимации вызываются перед обратными вызовами обхода (макеты, рисунки).

Это означает, что обратные вызовы анимации будут вызываться почти ровно на 60 кадров в секунду (сначала обрабатываются), тогда как обратные вызовы обхода могут иметь небольшой джиттер, когда макеты и чертеж просмотра сделаны (менее 1/60 секундного дрожания, но, вероятно, все еще заметны)

Ответ 2

Взгляните на этот класс: http://developer.android.com/reference/android/view/Choreographer.html

Краткая информация о документах: Координаты времени анимации, ввода и рисования.

Хореограф получает синхронизирующие импульсы (например, вертикальную синхронизацию) от подсистемы отображения, а затем планирует работу как часть рендеринга следующего кадра отображения.

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