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