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

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

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

With AndroidX Activity 1.8.0-alpha01 or higher, you can use the Predictive Back Progress APIs to develop custom animations for the predictive back gesture in your app. Progress APIs are helpful in animating views but have limitations when animating transitions between fragments. Within OnBackPressedCallback we've introduced the handleOnBackProgressed , handleOnBackCancelled and handleOnBackStarted methods to animate objects while the user swipes back. Use these methods if you need to customize more than the default animations provided by the system, or the Material Component animations.

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

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