Я работаю над анимацией пользовательских представлений для моего приложения для Android. Я выполнил это через Property Animations и вызвав invalidate()
в представлении в обратном вызове onAnimationUpdate()
, согласно https://developer.android.com/guide/topics/graphics/prop-animation.html:
В зависимости от того, какое свойство или объект вы анимируете, вам может потребоваться вызвать метод invalidate() в представлении, чтобы заставить экран перерисовываться с обновленными анимированными значениями. Вы делаете это в обратном вызове onAnimationUpdate().
Моя проблема в том, что, когда эти анимации запускаются в начале недавно запущенной Activity, они пропускают кадры в начале, заставляя их прыгать очень заметно. Я пробовал оба:
- Запуск анимации сразу из метода Activity
onCreate()
- Запуск анимации при обратном вызове
OnGlobalLayout()
с помощью ViewTreeObserver в корневом представлении Activity.
Я сделал последнее, так как думал, что анимация была вызвана до того, как макет был завершен, но результат тот же.
В журналах я определил, что обратный вызов onAnimationUpdate()
вызывается последовательно во всей анимации (то есть каждые 10-20 мс или около того от начала до конца). onAnimationUpdate()
просто вызывает invalidate()
, что вынуждает View перерисовывать себя, в идеале сразу (но документация утверждает, что это происходит "на некоторый момент в будущем" ). Это как раз проблема: onDraw()
вызывается только один или два раза в самом начале, прежде чем не будет вызываться около 250 мс. После этого он возобновляется, вызывая каждые 10-20 мс, так как он должен иметь все время. Но этот блок времени вызывает очень заметное отставание в анимации.
Чтобы быть ясным, эта проблема возникает только в начале Activity. Если я просто установил задержку 300 мс перед запуском анимации, она работает плавно на всем протяжении. Но мне это не нравится, поскольку он взломан. Похоже, проблема заключается в том, что onDraw()
не вызывается сразу после invalidate()
рядом с началом Activity. Но я не могу понять, почему это так, что блокирует onDraw()
или как его вообще исправить.
Я нашел только этот поток StackOverFlow: Анимация в начале действия пропускает кадры, где плакат имеет идентичную проблему. Основной код есть, и видео делают проблему понятной. Я тоже могу опубликовать свой код, но я думаю, что тот факт, что проблема появляется в самом базовом тестовом приложении, показывает, что там что-то происходит.