При использовании API-интерфейсов системы вы можете включить получение анимации внутри приложения и поддержку пользовательских переходов.
После регистрации ваше приложение будет отображать анимацию для возврата домой, перекрестной активности и перекрестных задач.
Вы также можете обновить зависимость компонента материала до версии 1.10.0 MDC Android, чтобы получать анимацию компонента материала, как показано ниже:
Более подробную информацию можно найти в руководстве для разработчиков компонентов Material на GitHub .
В видеоролике показан краткий пример предиктивной анимации возврата для перекрестной активности и возврата домой с использованием приложения «Настройки» Android.
- В анимации пользователь проводит пальцем назад, чтобы вернуться на предыдущий экран настроек — пример кросс-активной анимации.
- Теперь на предыдущем экране пользователь начинает смахивать назад во второй раз, показывая предварительный просмотр домашнего экрана с его обоями — пример анимации возврата на домашний экран.
- Пользователь продолжает свайп вправо, демонстрируя анимацию уменьшения окна до значка на главном экране.
- Теперь пользователь полностью вернулся на главный экран.
Узнайте больше о том, как добавить поддержку предиктивных жестов «назад» .
Добавляйте пользовательские переходы и анимацию в приложение
Вы можете создавать пользовательские анимации и переходы свойств в приложении, пользовательские анимации кросс-активности и пользовательские анимации кросс-фрагментов с помощью предиктивных жестов «назад».
Добавляйте пользовательские переходы с помощью 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 и более поздних версиях для создания предиктивных обратных переходов.
- Используйте
TransitionManager#controlDelayedTransition
вместоbeginDelayedTransition
для воспроизведения переходов, когда пользователь проводит пальцем назад. - Создайте переход внутри
handleOnBackStarted
. - Воспроизведите переход с событием «назад» в
handleOnBackProgressed
, связавcurrentFraction
сBackEvent.progress
, который показывает, насколько далеко пользователь прокрутил страницу назад. - Завершите переход после того, как пользователь совершит жест «назад» в
handleOnBackPressed
. - Наконец, сбросьте состояние перехода в
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 или выше.
Используйте предиктивные обратные кросс-фрагменты в следующих ситуациях:
- Анимируйте компонент навигации .
- Анимация с помощью
setCustomAnimations
. - Анимируйте переходы входа и выхода с помощью
setEnterTransition
,setExitTransition
,setReenterTransition
иsetReturnTransition
. - Анимируйте переходы общих элементов с помощью
setSharedElementEnterTransition
иsetSharedElementReturnTransition
.
Некоторые движения материалов поддерживают предиктивный возврат с версии 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 |
Дополнительные ресурсы
- Примеры предиктивного обратного кода
- Основы для системного заднего видео
- Создаем будущее видео для Android