10

Я работаю над анимацией пользовательских представлений для своего приложения для Android. Исполнив это с помощью Property Animations и вызова invalidate() на View в onAnimationUpdate() обратного вызова, согласно https://developer.android.com/guide/topics/graphics/prop-animation.html:Анимация в начале действия скачков

В зависимости от того, какой собственности или объекта вы анимировать, вы, возможно, необходимо вызвать метод Invalidate() на View чтобы заставить экран перерисовываться с обновленными анимированными значениями. Вы делаете это в обратном вызове onAnimationUpdate().

Моя проблема заключается в том, что, когда эти анимации запускаются в начале недавно начало активности, они пропускают кадры в начале, заставляя их прыгать очень заметно. Я попытался как:

  1. Запуск анимации непосредственно из onCreate() методы Activity в
  2. Запуске анимации на OnGlobalLayout() обратный вызов с использованием ViewTreeObserver корневого зрения своей деятельностью в.

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

С помощью журналов я определил, что обратный вызов вызывается последовательно по всей анимации (то есть каждые 10-20 мс или около того от начала до конца). onAnimationUpdate() просто вызывает invalidate(), что вынуждает View перерисовывать себя, в идеале сразу (но документация утверждает, что это происходит «в какой-то момент в будущем»). Кажется, это проблема: onDraw() вызывается только один или два раза в самом начале, прежде чем его не вызывают около 250 мс. После этого он возобновляется, вызывая каждые 10-20 мс, так как он должен иметь все время. Но этот блок времени вызывает очень заметное отставание в анимации.

Чтобы быть ясным, эта проблема возникает только в начале Деятельности. Если я просто установил задержку 300 мс перед запуском анимации, она работает плавно на всем протяжении. Но мне не нравится это решение, так как оно хакерское. Похоже, проблема заключается в том, что onDraw() не вызывается сразу после invalidate() в начале деятельности. Но я не могу понять, почему это так, что блокирует onDraw(), или как его вообще исправить.

Я нашел только этот поток StackOverFlow: Animation at the beginning of activity skips frames, где у плаката идентична проблема. Основной код есть, и видео делают проблему понятной. Я тоже могу опубликовать свой код, но я думаю, что тот факт, что проблема появляется в самом базовом тестовом приложении, показывает, что происходит что-то еще.

ответ

5

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

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

У меня не было настраиваемой анимации перехода, но по умолчанию есть один. Отключение анимации перехода, как было предложено, действительно устранило анимацию. Однако, поскольку это раздражает, я обнаружил следующий обратный вызов Activity: [onEnterAnimationComplete()] (https://developer.android.com/reference/android/app/Activity.html#onEnterAnimationComplete()). Здесь официально объясняется проблема: «Действия не могут рисоваться в течение периода, в котором их окна оживают». Запуск моей анимации из этого обратного вызова устраняет проблему. – asaini007

+0

@ asaini007 Метод есть, но ... доступен только от API 21. Кстати, он не работает все время. –

2

Похоже на то, что нитка нитки нитевидной линии истощается.

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

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

Смежные вопросы