Dodano obsługę animacji przewidywanego przejścia wstecz

Korzystając z interfejsów API powrotu do systemu, możesz włączyć animacje w aplikacji i obsługę niestandardowych przejść.

Film 1: Animacje przewidywania powrotu

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.

  1. W animacji użytkownik przesuwa palcem w lewo, aby wrócić do poprzedniego ekranu ustawień – jest to przykład animacji między aktywnościami.
  2. 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.
  3. Użytkownik nadal przesuwa palcem w prawo, co powoduje animację zmniejszania się okna do ikony na ekranie głównym.
  4. 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, handleOnBackCancelledhandleOnBackStarted 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.

  1. Użyj TransitionManager#controlDelayedTransition zamiast beginDelayedTransition, aby odtwarzać przejścia, gdy użytkownik przesuwa palcem z powrotem.
  2. Utwórz przejście w handleOnBackStarted.
  3. Odtwórz przejście ze zdarzeniem wstecz w ramach handleOnBackProgressed, powiązując currentFractionBackEvent.progress, co pokazuje, jak daleko użytkownik przesunął palcem do tyłu.
  4. Zakończ przejście po wykonaniu przez użytkownika gestu cofania w handleOnBackPressed.
  5. 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 ustaw TransitionSeekController na wynik TransitionManager.createSeekController zamiast na wynik controlDelayedTransition.

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żyj OVERRIDE_TRANSITION_CLOSE.
  • W przypadku określenia OVERRIDE_TRANSITION_CLOSE element enterAnim to animacja wejścia aktywności A, a element exitAnim 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órej FragmentManager nie wie.
  • Niektóre biblioteki obsługują funkcję przewidywania powrotu. Aby mieć pewność, sprawdź dokumentację.
  • Obsługiwane są klasa Animator i biblioteka AndroidX Transition.
  • Klasa Animation i biblioteka platformy Transition 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:

Niektóre animacje Material obsługują predykcyjne cofanie od wersji 1.12.02-alpha02 lub nowszej, w tym MaterialFadeThrough, MaterialSharedAxisMaterialFade. 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 przeztargetSdkVersioncompileSdkVersion, 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