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 się między zadaniami.
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.
Dodawanie niestandardowych przejść za pomocą interfejsu Progress API
W przypadku AndroidaX 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żyj 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 funkcji przewidywania powrotu.
- Użyj
TransitionManager#controlDelayedTransitionzamiastbeginDelayedTransition, aby odtwarzać przejścia, gdy użytkownik przesuwa palcem do tyłu. - Utwórz przejście w
handleOnBackStarted. - Odtwórz przejście ze zdarzeniem wstecz w ramach
handleOnBackProgressed, powiązująccurrentFractionzBackEvent.progress, co pokazuje, jak daleko użytkownik przesunął palcem do tyłu. - Zakończ przejście po wykonaniu przez użytkownika gestu cofnięcia w
handleOnBackPressed. - Na koniec zresetuj stan przejścia w
handleOnBackCancelled.
Poniższy film, kod 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 wartość
isSeekingSupported, aby zwracać wartość „prawda” w przypadku przejść niestandardowych. - Utwórz po 1 kontrolerze na każdą animację.
- Przejścia Predictive Back są obsługiwane w przypadku przejść AndroidX, ale nie w przypadku przejść frameworka. Zrezygnuj z przejść frameworka i zamiast nich używaj
Animatori przejść 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
handleOnBackStartedustawTransitionSeekControllerna wynikTransitionManager.createSeekControllerzamiast 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 na Androidzie 14 i nowszych, możesz użyć overrideActivityTransition zamiast overridePendingTransition. Oznacza to, że animacja przejścia jest odtwarzana, gdy użytkownik przesuwa palcem do tyłu.
Aby zilustrować, jak to może działać, wyobraź sobie sytuację, w której aktywność B znajduje się na aktywności A na liście wstecznej. Animacje niestandardowych działań możesz obsługiwać w ten sposób:
- Wywołaj przejścia otwierające lub zamykające w metodzie
onCreateaktywnoś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. Gdy określisz
OVERRIDE_TRANSITION_CLOSE,enterAnimbędzie animacją wejścia aktywności A, aexitAnim– animacją 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 sterowania 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
FragmentManagerlub komponentem nawigacji. Przewidywane cofanie nie jest obsługiwane, jeśli samodzielnie zarządzasz stosem wstecznym. Przenoszenie z powrotem z list wstecznych, o którychFragmentManagernie wie. - Niektóre biblioteki obsługują funkcję przewidywanego powrotu. Aby mieć pewność, sprawdź dokumentację.
- Obsługiwane są klasy
Animatori bibliotekiAndroidX Transition. - Klasa
Animationi biblioteka platformyTransitionnie 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,setReenterTransitionisetReturnTransition. - Animuj przejścia udostępnionych elementów za pomocą funkcji
setSharedElementEnterTransitionisetSharedElementReturnTransition.
Niektóre animacje Material
obsługują predykcyjne cofanie od wersji 1.12.02-alpha02
lub nowszej, w tym MaterialFadeThrough, MaterialSharedAxis i MaterialFade.
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 dotyczącym projektowania 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
W tabeli poniżej znajdziesz informacje o tym, co jest kontrolowane przeztargetSdkVersioni compileSdkVersion, wersję urządzenia, zależności, flagi 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 | Niestandardowa aktywność obejmująca różne rodzaje 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 | Niestandardowy fragment 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 z tyłu
- Tworzymy przyszłość filmów na Androidzie