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

При использовании 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 для анимации объектов, пока пользователь проводит пальцем назад. Используйте эти методы, если вам нужно настроить больше, чем стандартные анимации, предоставляемые системой, или анимации компонента материала.

Мы ожидаем, что большинство приложений будут использовать обратно совместимые 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 для ваших пользовательских переходов.
  • Создайте один контроллер для каждой анимации.
  • Переходы Predictive Back поддерживаются с переходами AndroidX, но не с переходами фреймворка. Откажитесь от переходов фреймворка и используйте вместо этого переходы Animator и AndroidX.
  • Предиктивные обратные переходы поддерживаются на устройствах под управлением Android 14 и выше и не имеют обратной совместимости.
  • Переходы, созданные с помощью XML-сцен, также поддерживаются. В handleOnBackStarted установите TransitionSeekController на результат TransitionManager.createSeekController вместо результата controlDelayedTransition .

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

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

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

  • Вызовите открывающий или закрывающий переход в методе 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 с помощью жеста. То, перемещаете ли вы жест за пределы порогового значения, определяет, будет ли он завершен и вы вернетесь к предыдущему фрагменту, или он будет отменен, и вы останетесь на текущем фрагменте. Для получения дополнительной информации см. Навигация между фрагментами с помощью анимации .

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

  • Импортируйте Transitions 1.5.0 или более поздней версии и Fragments 1.7.0 или более поздней версии. Большая часть поддержки предиктивного возврата в Fragments основана на способности Transitions искать анимации, что возможно только в Transitions 1.5.0 или более поздней версии.
  • Используйте Fragments с FragmentManager или Navigation Component для управления back stack. Predictive Back не поддерживается, если вы управляете собственным back stack. Мигрируйте из back stacks, о которых 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 targetSdk Версия устройства 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 Jetpack 34 Любой 34 истинный AndroidX активность 1.8

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