При использовании системных API-интерфейсов вы можете выбрать получение анимации в приложении и поддержку пользовательских переходов.
После согласия ваше приложение отображает анимацию для возвращения домой, перекрестных действий и перекрестных задач.
Вы также можете обновить зависимость компонента материала до версии 1.10.0 MDC Android, чтобы получать анимацию компонента материала, подобную следующей:
Дополнительные сведения см. в руководстве для разработчиков компонентов материалов на GitHub .
В видео показан краткий пример прогнозирующей анимации спины для перекрестной активности и возвращения домой с помощью приложения «Настройки Android».
- В анимации пользователь проводит пальцем назад, чтобы вернуться к предыдущему экрану настроек — пример анимации перекрестной активности.
- Теперь на предыдущем экране пользователь начинает проводить пальцем назад во второй раз, показывая предварительный просмотр главного экрана с его обоями — пример анимации возврата на главный экран.
- Пользователь продолжает проводить пальцем вправо, показывая анимацию уменьшения окна до значка на главном экране.
- Теперь пользователь полностью вернулся на главный экран.
Узнайте больше о том, как добавить поддержку интеллектуальных жестов назад .
Добавляйте собственные переходы и анимацию в приложении.
Вы можете создавать собственные анимации и переходы свойств в приложении, пользовательские анимации перекрестных действий и пользовательские анимации перекрестных фрагментов с помощью прогнозируемых жестов назад.
Добавляйте пользовательские переходы с помощью Progress API
В AndroidX Activity 1.8.0-alpha01 или более поздней версии вы можете использовать API-интерфейсы Predictive Back Progress для разработки пользовательских анимаций для прогнозируемого жеста назад в вашем приложении. API-интерфейсы Progress полезны при анимации представлений, но имеют ограничения при анимации переходов между фрагментами. В OnBackPressedCallback
мы представили методы handleOnBackProgressed
, handleOnBackCancelled
и handleOnBackStarted
для анимации объектов, пока пользователь проводит пальцем назад. Используйте эти методы, если вам нужно настроить больше, чем анимация по умолчанию, предоставляемая системой, или анимация компонентов материала.
Мы ожидаем, что большинство приложений будут использовать обратно совместимые API-интерфейсы AndroidX, но в интерфейсе OnBackAnimationCallback
также есть API-интерфейсы аналогичной платформы, доступные для тестирования в Android 14 Developer Preview 1 и более поздних версиях.
Используйте API Progress с AndroidX Transitions
API-интерфейсы Progress можно использовать с AndroidX Transitions 1.5.0-alpha01 или более поздней версии на Android 14 и более поздних версиях для создания прогнозируемых обратных переходов.
- Используйте
TransitionManager#controlDelayedTransition
вместоbeginDelayedTransition
, чтобы воспроизводить переходы, когда пользователь проводит пальцем назад. - Создайте переход внутри
handleOnBackStarted
. - Воспроизведите переход с помощью события back внутри
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>
При работе с переходами Predictive Back имейте в виду следующее:
- Используйте
isSeekingSupported
, чтобы проверить, поддерживает ли переход функцию Predictive Back. - Переопределите
isSeekingSupported
, чтобы вернуть true для ваших пользовательских переходов. - Создайте один контроллер для каждой анимации.
- Прогнозируемые обратные переходы поддерживаются переходами AndroidX, но не поддерживаются переходами платформы. Откажитесь от переходов платформы и используйте вместо них переходы
Animator
и AndroidX. - Предиктивные обратные переходы поддерживаются на устройствах под управлением Android 14 и более поздних версий и не имеют обратной совместимости.
- Также поддерживаются переходы, созданные с помощью XML-сцен. В
handleOnBackStarted
установите дляTransitionSeekController
результатTransitionManager.createSeekController
вместо результатаcontrolDelayedTransition
.
Добавьте пользовательские переходы действий на Android 14 и более поздних версиях.
Чтобы обеспечить поддержку пользовательских переходов активности Predictive Back на Android 14 и более поздних версиях, вы можете использовать overrideActivityTransition
вместо overridePendingTransition
. Это означает, что анимация перехода воспроизводится, когда пользователь проводит пальцем назад.
Чтобы проиллюстрировать, как это может работать, представьте себе сценарий, в котором действие B находится поверх действия A в заднем стеке. Вы можете обрабатывать пользовательскую анимацию действий следующим образом:
- Вызовите открывающие или закрывающие переходы в методе
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 с помощью этого жеста. От того, переместите ли вы жест за пороговое значение, зависит, будет ли он завершен и вы вернетесь к предыдущему фрагменту, или он будет отменен, и вы останетесь на текущем фрагменте. Дополнительные сведения см. в разделе «Навигация между фрагментами с помощью анимации» .
Имейте в виду следующие факторы:
- Импортируйте переходы 1.5.0 или новее и фрагменты 1.7.0 или новее. Большая часть предиктивной обратной поддержки во фрагментах основана на способности Transitions искать анимацию, что возможно только в Transitions 1.5.0 или более поздних версиях.
- Используйте Fragments либо с
FragmentManager
, либо с компонентом навигации для обработки обратного стека. Функция Predictive Back не поддерживается, если вы управляете собственным стеком резервных копий. Мигрируйте из бэк-стеков, о которых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 | цельSdk | Версия устройства | 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 Джетпак | 34 | Любой | 34 | истинный | AndroidX-активность 1.8 |