Анимация представления Android и аппаратные уровни

В настоящее время я пытаюсь понять, как правильно использовать аппаратные слои при анимации видов.

Я реализую ViewGroup, который позволяет пользователю перетаскивать дочернее представление, после чего я анимирую его в положение, когда они отпускают (например, как ViewPager будет располагаться на странице). В этой статье говорится, что аппаратные уровни следует включать только на время анимации.

Проблема, с которой я сталкиваюсь, заключается в том, что после включения аппаратных слоев Android должен создавать слои, что на Galaxy Nexus занимает 70-100 мс. Это означает, что я не могу сделать это непосредственно перед запуском анимации, так как задержка между перетаскиванием и анимацией будет очень заметной. Я также не могу включить его при запуске перетаскивания по той же причине.

Теперь эта задержка присутствует только при первом создании аппаратных слоев, поэтому в идеале я бы хотел, чтобы они создавались, как только представления добавляются в макет. Мне указали на View.buildLayer() , но я не уверен, как подойти к этому.

  • Каким будет правильный способ добиться этого?
  • Есть ли какие-либо методы в моей ViewGroup, которые я могу переопределить и вызвать buildLayer() для дочерних представлений?
  • Может ли аппаратный уровень быть каким-то образом аннулирован, вызывая еще одну задержку в 70-100 мс? И как мне справиться с этим?

person SimonVT    schedule 04.09.2012    source источник
comment
что такое аппаратный уровень - glsurfaceview?   -  person Marcin Orlowski    schedule 05.09.2012
comment
Я имею в виду следующее: developer.android.com/reference/android/view/   -  person SimonVT    schedule 05.09.2012


Ответы (1)


Задержка возникает, когда в кеше нет слоя, вы не должны видеть эту задержку для последующих вызовов setLayerType(NONE)/setLayerType(HARDWARE). Вы можете вызвать buildLayer() из onSizeChanged(), чтобы принудительно построить слой, а затем поместить его в кеш (вызовите setLayerType(NONE), чтобы переместить слой в кеш).

Обратите внимание, что задержка, которую вы видите, сильно зависит от устройства, на котором вы работаете.

Причина, по которой вам не следует оставлять слои включенными, заключается в том, что это удваивает объем работы по рисованию при каждом обновлении вида. Например, если вы переместите ListView в слой, а затем прокрутите список, каждое обновление кадра во время анимации прокрутки вызовет: (а) перерисовку списка в слой (б) слой, который будет отображаться на экране. Это чрезвычайно расточительно и может вызвать проблемы с производительностью в зависимости от сложности вашего пользовательского интерфейса.

person Romain Guy    schedule 04.09.2012
comment
Ладно, может быть, я отпраздновал немного раньше. Я случайно оставил его в HARDWARE. Я вижу, что он создает слой после onSizeChanged(), занимая обычные 70+ мс. Однако то же самое происходит при первом переключении на HARDWARE, когда мне нужно его анимировать. - person SimonVT; 05.09.2012
comment
Просто чтобы быть ясным, я получаю большую задержку дважды. Один раз, когда я строюLayer() из onSizeChanged(), и один раз в первый раз, когда я анимирую представление. После этого задержки нет. - person SimonVT; 05.09.2012