Добавить поддержку прогнозируемой анимации движения назад.Добавить поддержку прогнозируемой анимации движения назад.

При использовании системных API-интерфейсов вы можете выбрать получение анимации в приложении и поддержку пользовательских переходов.

Видео: прогнозирующая анимация спины

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

Вы также можете обновить зависимость компонента материала до версии 1.10.0 MDC Android, чтобы получать анимацию компонента материала, подобную следующей:

Дополнительные сведения см. в руководстве для разработчиков компонентов материалов на GitHub .

В видео показан краткий пример прогнозирующей анимации спины для перекрестной активности и возвращения домой с помощью приложения «Настройки Android».

  1. В анимации пользователь проводит пальцем назад, чтобы вернуться к предыдущему экрану настроек — пример анимации перекрестной активности.
  2. Теперь на предыдущем экране пользователь начинает проводить пальцем назад во второй раз, показывая предварительный просмотр главного экрана с его обоями — пример анимации возврата на главный экран.
  3. Пользователь продолжает проводить пальцем вправо, показывая анимацию уменьшения окна до значка на главном экране.
  4. Теперь пользователь полностью вернулся на главный экран.

Узнайте больше о том, как добавить поддержку интеллектуальных жестов назад .

Добавляйте собственные переходы и анимацию в приложении.

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

Добавляйте пользовательские переходы с помощью Progress API

В AndroidX Activity 1.8.0-alpha01 или более поздней версии вы можете использовать API-интерфейсы Predictive Back Progress для разработки пользовательских анимаций для прогнозируемого жеста назад в вашем приложении. API-интерфейсы Progress полезны при анимации представлений, но имеют ограничения при анимации переходов между фрагментами. В OnBackPressedCallback мы представили методы handleOnBackProgressed , handleOnBackCancelled и handleOnBackStarted для анимации объектов, пока пользователь проводит пальцем назад. Используйте эти методы, если вам нужно настроить больше, чем анимация по умолчанию, предоставляемая системой, или анимация компонентов материала.

Мы ожидаем, что большинство приложений будут использовать обратно совместимые API-интерфейсы AndroidX, но в интерфейсе OnBackAnimationCallback также есть API-интерфейсы аналогичной платформы, доступные для тестирования в Android 14 Developer Preview 1 и более поздних версиях.

Используйте API Progress с AndroidX Transitions

API-интерфейсы Progress можно использовать с AndroidX Transitions 1.5.0-alpha01 или более поздней версии на Android 14 и более поздних версиях для создания прогнозируемых обратных переходов.

  1. Используйте TransitionManager#controlDelayedTransition вместо beginDelayedTransition , чтобы воспроизводить переходы, когда пользователь проводит пальцем назад.
  2. Создайте переход внутри handleOnBackStarted .
  3. Воспроизведите переход с помощью события back внутри handleOnBackProgressed , связав currentFraction с BackEvent.progress , который показывает, насколько далеко пользователь прокрутил назад.
  4. Завершите переход после того, как пользователь совершил жест назад в handleOnBackPressed .
  5. Наконец, сбросьте состояние перехода внутри handleOnBackCancelled .

В следующем видео, коде Kotlin и XML демонстрируется пользовательский переход между двумя блоками, реализованный с помощью OnBackPressedCallback :

    class MyFragment : Fragment() {

    val transitionSet = TransitionSet().apply {
        addTransition(Fade(Fade.MODE_OUT))
        addTransition(ChangeBounds())
        addTransition(Fade(Fade.MODE_IN))
    }
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val callback = object : OnBackPressedCallback(enabled = false) {

            var controller: TransitionSeekController? = null

            @RequiresApi(34)
            override fun handleOnBackStarted(backEvent: BackEvent) {
                // Create the transition
                controller = TransitionManager.controlDelayedTransition(
                    binding.card,
                    transitionSet
                )
                changeTextVisibility(ShowText.SHORT)
            }

            @RequiresApi(34)
            override fun handleOnBackProgressed(backEvent: BackEvent) {
                // Play the transition as the user swipes back
                if (controller?.isReady == true) {
                    controller?.currentFraction = backEvent.progress
                }
            }

            override fun handleOnBackPressed() {
                // Finish playing the transition when the user commits back
                controller?.animateToEnd()
                this.isEnabled = false
            }

            @RequiresApi(34)
            override fun handleOnBackCancelled() {
                // If the user cancels the back gesture, reset the state
                transition(ShowText.LONG)
            }
        }

        binding.shortText.setOnClickListener {
            transition(ShowText.LONG)
            callback.isEnabled = true
        }

        this.requireActivity().onBackPressedDispatcher.addCallback(callback)
    }

    private fun transition(showText: ShowText) {
        TransitionManager.beginDelayedTransition(
            binding.card,
            transitionSet
        )
        changeTextVisibility(showText)
    }

    enum class ShowText { SHORT, LONG }
    private fun changeTextVisibility(showText: ShowText) {
        when (showText) {
            ShowText.SHORT -> {
                binding.shortText.isVisible = true
                binding.longText.isVisible = false
            }
            ShowText.LONG -> {
                binding.shortText.isVisible = false
                binding.longText.isVisible = true
            }
        }
    }
}
  
<?xml version="1.0" encoding="utf-8"?>
...
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...>

        <TextView
            android:id="@+id/short_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            ... />

        <TextView
            android:id="@+id/long_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"
            .../>

    </androidx.constraintlayout.widget.ConstraintLayout>

При работе с переходами Predictive Back имейте в виду следующее:

  • Используйте isSeekingSupported , чтобы проверить, поддерживает ли переход функцию Predictive Back.
  • Переопределите isSeekingSupported , чтобы вернуть true для ваших пользовательских переходов.
  • Создайте один контроллер для каждой анимации.
  • Прогнозируемые обратные переходы поддерживаются переходами AndroidX, но не поддерживаются переходами платформы. Откажитесь от переходов платформы и используйте вместо них переходы Animator и AndroidX.
  • Предиктивные обратные переходы поддерживаются на устройствах под управлением Android 14 и более поздних версий и не имеют обратной совместимости.
  • Также поддерживаются переходы, созданные с помощью XML-сцен. В handleOnBackStarted установите для TransitionSeekController результат TransitionManager.createSeekController вместо результата controlDelayedTransition .

Добавьте пользовательские переходы действий на Android 14 и более поздних версиях.

Чтобы обеспечить поддержку пользовательских переходов активности Predictive Back на Android 14 и более поздних версиях, вы можете использовать overrideActivityTransition вместо overridePendingTransition . Это означает, что анимация перехода воспроизводится, когда пользователь проводит пальцем назад.

Чтобы проиллюстрировать, как это может работать, представьте себе сценарий, в котором действие B находится поверх действия A в заднем стеке. Вы можете обрабатывать пользовательскую анимацию действий следующим образом:

  • Вызовите открывающие или закрывающие переходы в методе onCreate действия B.
  • Когда пользователь переходит к действию B, используйте OVERRIDE_TRANSITION_OPEN . Когда пользователь проводит пальцем, чтобы вернуться к действию A, используйте OVERRIDE_TRANSITION_CLOSE .
  • При указании OVERRIDE_TRANSITION_CLOSE enterAnim — это анимация входа действия A, а exitAnim — анимация выхода действия B.

Добавить поддержку Predictive Back с фрагментами.

При реализации Predictive Back с фрагментами существует два подхода.

Используйте существующие API

Мы рекомендуем использовать существующие API. Эти API позволяют вам проводить пальцем от края экрана, чтобы управлять переходами Animator или Androidx с помощью этого жеста. От того, переместите ли вы жест за пороговое значение, зависит, будет ли он завершен и вы вернетесь к предыдущему фрагменту, или он будет отменен, и вы останетесь на текущем фрагменте. Дополнительные сведения см. в разделе «Навигация между фрагментами с помощью анимации» .

Имейте в виду следующие факторы:

  • Импортируйте переходы 1.5.0 или новее и фрагменты 1.7.0 или новее. Большая часть предиктивной обратной поддержки во фрагментах основана на способности Transitions искать анимацию, что возможно только в Transitions 1.5.0 или более поздних версиях.
  • Используйте Fragments либо с FragmentManager , либо с компонентом навигации для обработки обратного стека. Функция Predictive Back не поддерживается, если вы управляете собственным стеком резервных копий. Мигрируйте из бэк-стеков, о которых FragmentManager не знает.
  • Некоторые библиотеки включают поддержку Predictive Back. Чтобы быть уверенным, проверьте документацию.
  • Поддерживаются класс Animator и библиотека AndroidX Transition .
  • Класс Animation и библиотека Transition платформы не поддерживаются.
  • Прогнозирующая анимация работает только на устройствах под управлением Android 14 или более поздней версии.

Используйте прогнозирующие задние перекрестные фрагменты в следующих ситуациях:

Некоторые движения материалов поддерживают прогнозирование начиная с версии 1.12.02-alpha02 или выше, включая MaterialFadeThrough , MaterialSharedAxis и MaterialFade . Примечание. MaterialContainerTransform не поддерживает обратное прогнозирование.

Используйте обратные вызовы

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

Создайте OnBackPressedCallback . Внутри handleOnBackProgressed масштабируйте и сдвигайте фрагмент. Затем вытащите из задней стопки. Затем запустите переход общего элемента, используя setSharedElementReturnTransition вне обратного вызова.

Дополнительные сведения см. в примере кода на GitHub.

Требования

Используйте следующую таблицу, чтобы понять, чем управляют targetSdkVersion и compileSdkVersion , версией устройства, зависимостями, флагами манифеста и флагами фрагмента. Эта таблица относится к требованиям кодекса.

Категория Анимация скомпилироватьSdk цельSdk Версия устройства Android: EnableOnBackInvokedCallback Зависимость
Системные анимации Возвращение домой 33 Любой 35 истинный Никто
Перекрестная активность 34 Любой 35 истинный Никто
Перекрестная задача 34 Любой 35 истинный Никто
Платформа Пользовательская перекрестная активность 34 Любой 35 истинный Никто
API-платформа Прогресса 34 Любой 34 истинный Никто
Материальные компоненты Нижний лист 34 Любой 34 истинный Материальный компонент 1.10.0
Боковой лист 34 Любой 34 истинный Материальный компонент 1.10.0
Навигационный ящик 34 Любой 34 истинный Материальный компонент 1.10.0
Поиск 34 Любой 34 истинный Материальный компонент 1.10.0
Анимации реактивного ранца Пользовательский кросс-фрагмент AndroidX 34 Любой 34 истинный AndroidX-фрагмент 1.7
Пользовательские переходы AndroidX 34 Любой 34 истинный AndroidX переход 1.5
Прогресс API Джетпак 34 Любой 34 истинный AndroidX-активность 1.8

Дополнительные ресурсы