Android-анимация анимации и аппаратные уровни

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

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

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

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

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

Ответы

Ответ 1

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

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

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