Анимация в начале действия прыгает

Я работаю над анимацией пользовательских представлений для моего приложения для 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: Анимация в начале действия пропускает кадры, где плакат имеет идентичную проблему. Основной код есть, и видео делают проблему понятной. Я тоже могу опубликовать свой код, но я думаю, что тот факт, что проблема появляется в самом базовом тестовом приложении, показывает, что там что-то происходит.

Ответ 1

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

startActivity(intent);
getActivity().overridePendingTransition(0, 0); 

Ответ 2

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

Я бы использовал traceview, чтобы быть уверенным, что нет никаких методов, блокирующих ваши призывы рисования. http://tools.android.com/tips/traceview

Это поможет вам определить, что вызывается вместо метода onDraw.