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

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

Видео 1: Анимация движения спины с функцией прогнозирования

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

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

Для получения дополнительной информации см. руководство для разработчиков компонентов Material Design на GitHub .

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

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

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

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

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

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

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

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

Используйте API Progress с переходами AndroidX.

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 и выше.

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

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

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

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

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

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

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

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

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

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

В некоторых вариантах перемещения материалов, начиная с версии 1.12.02-alpha02 и выше, поддерживается функция прогнозирования обратного хода, включая MaterialFadeThrough , MaterialSharedAxis и MaterialFade .

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

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

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

Для получения более подробной информации см. пример кода на GitHub.

Требования

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

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

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