Добавить анимацию ввода для запуска пункта назначения в навигационном компоненте Android

Я знаю, как добавить анимацию входа и выхода в тег action на графике навигации. Я также знаю, как динамически добавлять анимацию с помощью NavOptions при навигации с помощью navController.

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

  1. Применение анимации к корневому виду пункта назначения
  2. Использование временного начального целевого фрагмента, который будет заменен исходным целевым фрагментом.
  3. Применение анимации к контейнеру (FrameLayout) NavHostFragment и динамическое добавление фрагмента хоста

Но хотелось бы знать, есть ли какое-нибудь официальное решение для этой цели.

Спасибо




Ответы (1)


Не существует официального способа анимировать startDestination фрагмент, и я считаю, что вам не следует его анимировать. Ваш startDestination фрагмент появляется в поле зрения несколькими способами, и у каждого из них есть свои способы запуска анимации:

  1. Ваш NavHost размещен в действии, и это действие запускается из модуля запуска. Пусковые установки обычно переопределяют переходы между окнами, чтобы ваши действия выглядели красиво.
  2. Ваш NavHost размещен в действии, а это действие запускается другим действием. Используйте переходы действий, чтобы переопределить переходы по умолчанию.
  3. Ваш NavHost вложен во фрагмент. Когда он попадает в поле зрения, содержащийся фрагмент выполняет свой собственный переход.

Как вы можете видеть, во всех случаях при появлении или исчезновении startDestination фрагмента задействован другой переход, поэтому переход фрагмента здесь, скорее всего, столкнется с существующим переходом, что сделает его неприятным.

В то же время, если вы действительно хотите его оживить, есть несколько способов. Помимо упомянутого в вопросе, я могу думать об этом:

  1. Если вы используете собственные фрагменты, установите переходы фрагментов по умолчанию в теме приложения с атрибутами fragmentOpenEnterAnimation, fragmentOpenExitAnimation и так далее. Обновление: это не имеет смысла в контексте вопроса и в любом случае не сработает.
  2. Переопределите методы Fragment.onCreateAnimation или Fragment.onCreateAnimator в вашем фрагменте и верните анимацию / аниматор.
person esentsov    schedule 05.08.2019
comment
Спасибо за ваше описание. У меня был конкретный сценарий, поэтому мне пришлось отключить анимацию активности по умолчанию. Однако я установил BottomNavigationBar с NavController на основе моих требований, и кажется, что он использует анимацию затухания при первом отображении пункта назначения, а также при переключении между верхними уровнями. - person Misagh Emamverdi; 06.08.2019
comment
Это интересно, я не думаю, что BottomNavigationBar каким-либо образом изменяет поведение по умолчанию, поэтому startDestination не следует анимировать и в этом случае. Однако при переключении между пунктами назначения используется плавная анимация. - person esentsov; 06.08.2019