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

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

Видео 1: Предиктивная обратная анимация

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

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

Более подробную информацию см. в руководстве разработчика компонентов Material на GitHub .

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

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

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

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

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

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

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

Мы ожидаем, что большинство приложений будут использовать обратно совместимые API AndroidX, но существуют также похожие платформенные API в интерфейсе OnBackAnimationCallback , доступные для тестирования в 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. Воспроизвести переход с событием «назад» в 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>

При работе с предиктивными обратными переходами помните следующее:

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

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

Чтобы обеспечить поддержку функции «Предиктивный возврат» для настраиваемых переходов Activity на Android 14 и более поздних версиях, можно использовать overrideActivityTransition вместо overridePendingTransition . Это означает, что анимация перехода будет воспроизводиться при смахивании пользователем экрана назад.

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

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

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

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

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

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

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

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

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

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

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

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

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

Более подробную информацию можно найти в примере кода на GitHub.

Требования

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

Категория Анимация compileSdk targetSdk Версия устройства android:enableOnBackInvokedCallback Зависимость
Системные анимации Возвращение домой 33 Любой 35 истинный Никто
Перекрестная активность 34 Любой 35 истинный Никто
Кросс-задача 34 Любой 35 истинный Никто
Платформа Пользовательская перекрестная активность 34 Любой 35 истинный Никто
Платформа API Progress 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 Transition 1.5
Progress API Jetpack 34 Любой 34 истинный AndroidX Activity 1.8

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