С помощью 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 и выше для создания предиктивных переходов «Назад».
- Используйте
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.