Добавить поддержку анимаций возврата (predictive back animations) в представлениях.

С помощью Views или Compose вы можете создавать пользовательские анимации и переходы для свойств приложения, пользовательские анимации для разных активностей и пользовательские анимации для разных фрагментов с помощью предиктивных жестов возврата. Чтобы попробовать способ с Compose, см. раздел «Добавление поддержки предиктивных анимаций возврата» .

Добавляйте пользовательские переходы с помощью 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 и выше.

Используйте 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 .

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