Korzystając z interfejsów API powrotu do systemu, możesz włączyć animacje w aplikacji i obsługę niestandardowych przejść.
Po włączeniu tej funkcji aplikacja będzie wyświetlać animacje powrotu do ekranu głównego, przechodzenia między aktywnościami i przełączania zadań.
Możesz też zaktualizować zależność komponentu materiału do wersji 1.10.0 biblioteki MDC Android, aby otrzymywać animacje komponentów materiału, takie jak te:
Więcej informacji znajdziesz w przewodniku dla programistów dotyczącym komponentów Material na GitHubie.
Film przedstawia krótki przykład animacji przewidywania powrotu w przypadku przejścia między aktywnościami i powrotu do ekranu głównego w aplikacji Ustawienia na Androidzie.
- W animacji użytkownik przesuwa palcem w lewo, aby wrócić do poprzedniego ekranu ustawień – jest to przykład animacji między aktywnościami.
- Na poprzednim ekranie użytkownik ponownie przesuwa palcem w tył, wyświetlając podgląd ekranu głównego z tapetą – przykład animacji powrotu do ekranu głównego.
- Użytkownik nadal przesuwa palcem w prawo, co powoduje animację zmniejszania się okna do ikony na ekranie głównym.
- Użytkownik wrócił już w pełni do ekranu głównego.
Dowiedz się więcej o tym, jak dodać obsługę gestów powrotu z prognozowaniem.
Dodawanie niestandardowych przejść i animacji w aplikacji
Możesz tworzyć niestandardowe animacje i przejścia w aplikacji, niestandardowe animacje między aktywnościami oraz niestandardowe animacje między fragmentami z gestami przewidywania powrotu.
Dodawanie niestandardowych przejść za pomocą interfejsu Progress API
W przypadku Androida X Activity w wersji 1.8.0-alpha01 lub nowszej możesz używać interfejsów Predictive Back
Progress API do tworzenia niestandardowych animacji gestu przewidywanego powrotu w aplikacji. Interfejsy Progress API są przydatne do animowania widoków, ale mają ograniczenia w przypadku animowania przejść między fragmentami. W ramach
OnBackPressedCallback
wprowadziliśmy metody
handleOnBackProgressed
,
handleOnBackCancelled
i
handleOnBackStarted
do animowania obiektów podczas przesuwania palcem w tył. Używaj tych metod, jeśli chcesz dostosować więcej animacji niż domyślne animacje dostarczane przez system lub animacje komponentów Material.
Oczekujemy, że większość aplikacji będzie korzystać ze zgodnych wstecznie interfejsów API AndroidX, ale w OnBackAnimationCallback
dostępne są też podobne interfejsy API platformy, które można testować w wersji Developer Preview 1 Androida 14 i nowszych.
Korzystanie z interfejsów Progress API z przejściami AndroidX
Interfejsów Progress API można używać z AndroidX Transitions w wersji 1.5.0-alpha01 lub nowszej na Androidzie 14 i nowszym do tworzenia przejść w ramach przewidywanego powrotu.
- Użyj
TransitionManager#controlDelayedTransition
zamiastbeginDelayedTransition
, aby odtwarzać przejścia, gdy użytkownik przesuwa palcem z powrotem. - Utwórz przejście w
handleOnBackStarted
. - Odtwórz przejście ze zdarzeniem wstecz w ramach
handleOnBackProgressed
, powiązująccurrentFraction
zBackEvent.progress
, co pokazuje, jak daleko użytkownik przesunął palcem do tyłu. - Zakończ przejście po wykonaniu przez użytkownika gestu cofania w
handleOnBackPressed
. - Na koniec zresetuj stan przejścia w
handleOnBackCancelled
.
Poniższy film, kod w języku Kotlin i kod XML przedstawiają niestandardowe przejście między 2 polami zaimplementowane za pomocą funkcji 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>
Podczas pracy z przejściami do poprzedniej strony pamiętaj o tych kwestiach:
- Użyj
isSeekingSupported
, aby sprawdzić, czy przejście obsługuje predykcyjne cofanie. - Zastąp
isSeekingSupported
, aby zwracać wartość „prawda” w przypadku przejść niestandardowych. - Utwórz po 1 kontrolerze na animację.
- Przejścia do poprzedniej strony są obsługiwane w przypadku przejść AndroidX, ale nie w przypadku przejść frameworka. Zrezygnuj z przejść frameworka i zamiast nich używaj przejść
Animator
i AndroidX. - Przejścia z użyciem funkcji przewidywania powrotu są obsługiwane na urządzeniach z Androidem 14 i nowszym i nie są wstecznie kompatybilne.
- Obsługiwane są też przejścia utworzone za pomocą scen XML. W
handleOnBackStarted
ustawTransitionSeekController
na wynikTransitionManager.createSeekController
zamiast na wynikcontrolDelayedTransition
.
Dodawanie niestandardowych przejść między aktywnościami na Androidzie 14 i nowszym
Aby mieć pewność, że niestandardowe przejścia między aktywnościami obsługują predykcyjne cofanie w Androidzie 14 i nowszych wersjach, możesz użyć overrideActivityTransition
zamiast overridePendingTransition
. Oznacza to, że animacja przejścia jest odtwarzana, gdy użytkownik przesuwa palcem z powrotem.
Aby zilustrować, jak to może działać, wyobraź sobie scenariusz, w którym aktywność B znajduje się na aktywności A na liście wstecznej. Animacje niestandardowych aktywności możesz obsługiwać w ten sposób:
- Wywołaj przejścia otwierające lub zamykające w metodzie
onCreate
aktywności B. - Gdy użytkownik przechodzi do aktywności B, użyj
OVERRIDE_TRANSITION_OPEN
. Gdy użytkownik przesunie palcem, aby wrócić do aktywności A, użyjOVERRIDE_TRANSITION_CLOSE
. W przypadku określenia
OVERRIDE_TRANSITION_CLOSE
elemententerAnim
to animacja wejścia aktywności A, a elementexitAnim
to animacja wyjścia aktywności B.
Dodanie obsługi gestu przewidywanego przejścia wstecz we fragmentach
Podczas wdrażania przewidywanego przejścia wstecz z fragmentami można zastosować 2 podejścia.
Korzystanie z dotychczasowych interfejsów API
Zalecamy korzystanie z dotychczasowych interfejsów API. Te interfejsy API umożliwiają przesuwanie palcem od krawędzi ekranu w celu manipulowania animatorem lub przejściami Androidx za pomocą gestu. To, czy przesuniesz gest poza próg, decyduje o tym, czy zostanie on ukończony i wrócisz do poprzedniego fragmentu, czy zostanie anulowany i pozostaniesz w bieżącym fragmencie. Więcej informacji znajdziesz w artykule Przechodzenie między fragmentami za pomocą animacji.
Pamiętaj o tych kwestiach:
- Zaimportuj Transitions 1.5.0 lub nowszą i Fragments 1.7.0 lub nowszą. Większość funkcji predykcyjnego cofania w fragmentach zależy od możliwości wyszukiwania animacji w przejściach, co jest możliwe tylko w przejściach w wersji 1.5.0 lub nowszej.
- Do obsługi stosu wstecznego używaj fragmentów z
FragmentManager
lub komponentu nawigacji. Przewidywane cofanie nie jest obsługiwane, jeśli zarządzasz własnym stosem wstecznym. Przenoszenie z powrotem z listy wstecznej, o którejFragmentManager
nie wie. - Niektóre biblioteki obsługują funkcję przewidywania powrotu. Aby mieć pewność, sprawdź dokumentację.
- Obsługiwane są klasa
Animator
i bibliotekaAndroidX Transition
. - Klasa
Animation
i biblioteka platformyTransition
nie są obsługiwane. - Animacje predykcyjne działają tylko na urządzeniach z Androidem 14 lub nowszym.
Używaj przewidywanego powrotu do poprzedniego fragmentu w tych sytuacjach:
- Animowanie komponentu nawigacji
- Animuj za pomocą
setCustomAnimations
. - Animuj przejścia wejścia i wyjścia za pomocą
setEnterTransition
,setExitTransition
,setReenterTransition
isetReturnTransition
. - Animuj przejścia udostępnionych elementów za pomocą funkcji
setSharedElementEnterTransition
isetSharedElementReturnTransition
.
Niektóre animacje Material obsługują predykcyjne cofanie od wersji 1.12.02-alpha02 lub nowszej, w tym MaterialFadeThrough
, MaterialSharedAxis
i MaterialFade
. Uwaga: MaterialContainerTransform
nie obsługuje predykcyjnego cofania.
Używanie wywołań zwrotnych
Przejście między fragmentami możesz utworzyć za pomocą wywołań zwrotnych, ale w przypadku korzystania z nich występuje znane ograniczenie, które polega na tym, że użytkownicy nie widzą poprzedniego fragmentu podczas przesuwania palcem w tył. Aby utworzyć przejście elementu udostępnionego między fragmentami, które odpowiada wskazówkom projektowym dotyczącym przewidywanego powrotu, wykonaj te czynności:
Utwórz OnBackPressedCallback
. W ramach handleOnBackProgressed
skaluj i przesuwaj fragment. Następnie usuń go z tylnej części stosu. Następnie uruchom przejście elementu udostępnionego za pomocą funkcji setSharedElementReturnTransition
poza wywołaniem zwrotnym.
Więcej informacji znajdziesz w przykładowym kodzie na GitHubie.
Wymagania
Z tabeli poniżej dowiesz się, co jest kontrolowane przeztargetSdkVersion
i compileSdkVersion
, wersję urządzenia, zależności, flagi pliku manifestu i flagi fragmentu. Ta tabela odnosi się do wymagań dotyczących kodu.
Kategoria | Animacja | compileSdk | targetSdk | Wersja urządzenia | android:enableOnBackInvokedCallback | Zależność |
---|---|---|---|---|---|---|
Animacje systemowe | Powrót do strony głównej | 33 | Dowolny | 35 | PRAWDA | Brak |
Różne aktywności | 34 | Dowolny | 35 | PRAWDA | Brak | |
Wiele zadań | 34 | Dowolny | 35 | PRAWDA | Brak | |
Platforma | Niestandardowe aktywności | 34 | Dowolny | 35 | PRAWDA | Brak |
Platforma Progress API | 34 | Dowolny | 34 | PRAWDA | Brak | |
Komponenty Material | Plansza dolna | 34 | Dowolny | 34 | PRAWDA | Komponent Material 1.10.0 |
Arkusz boczny | 34 | Dowolny | 34 | PRAWDA | Komponent Material 1.10.0 | |
Panel nawigacji | 34 | Dowolny | 34 | PRAWDA | Komponent Material 1.10.0 | |
Szukaj | 34 | Dowolny | 34 | PRAWDA | Komponent Material 1.10.0 | |
Jetpack Animations | Niestandardowe przejście między fragmentami AndroidX | 34 | Dowolny | 34 | PRAWDA | AndroidX Fragment 1.7 |
Niestandardowe przejścia AndroidX | 34 | Dowolny | 34 | PRAWDA | AndroidX Transition 1.5 | |
Progress API Jetpack | 34 | Dowolny | 34 | PRAWDA | AndroidX Activity 1.8 |
Dodatkowe materiały
- Przykłady kodu predykcyjnego powrotu
- Podstawowe informacje o filmach z systemem
- Tworzymy przyszłość filmów na Androidzie