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