Dodano obsługę animacji przewidywanego przejścia wstecz

Podczas korzystania z interfejsów API systemu możesz wyrazić zgodę na wyświetlanie animacji w aplikacji i obsługę niestandardowych przejść.

Film 1. Animacje przewidujące ruch

Po włączeniu tej opcji aplikacja będzie wyświetlać animacje w przypadku powrotu do ekranu głównego, przełączania aktywności i przełączania zadań.

Możesz też zaktualizować zależność komponentu Material Design do wersji 1.10.0 MDC na Androida, aby uzyskać animacje komponentów Material Design, takie jak:

Więcej informacji znajdziesz w wskazówkach dla programistów komponentów treści na GitHubie.

Film pokazuje krótki przykład przewidujących animacji powrotu w ramach aktywności i powrotu do ekranu głównego w aplikacji Ustawienia na Androidzie.

  1. W animacji użytkownik przesuwa palcem z powrotem, aby wrócić do poprzedniego ekranu ustawień – przykładowej animacji obejmującej różne działania.
  2. Na poprzednim ekranie użytkownik zaczyna drugi raz przesuwać palcem wstecz, wyświetlając podgląd ekranu głównego z tapetą – przykładem animacji przejścia na ekran główny.
  3. Użytkownik przesuwa palcem w prawo, co powoduje animację okna, które zmniejsza się do ikony na ekranie głównym.
  4. Użytkownik wrócił w pełni do ekranu głównego.

Dowiedz się więcej o dodawaniu obsługi przewidujących gestów wstecz.

Dodawanie niestandardowych przejść i animacji w aplikacji

Możesz tworzyć niestandardowe animacje i przejścia w usłudze w aplikacji, niestandardowe animacje między aktywnościami oraz niestandardowe animacje między fragmentami z wykorzystaniem przewidujących gestów wstecz.

Dodawanie niestandardowych przejść za pomocą interfejsu Progress API

W wersji Activity 1.8.0-alpha01 lub nowszej z AndroidX możesz używać interfejsów API Progresywny przewidujący powrót, aby tworzyć niestandardowe animacje dla przewidującego powrotu gestów w aplikacji. Interfejsy API Progresywny są przydatne przy animowaniu widoków, ale mają ograniczenia w animowaniu przejść między fragmentami. W narzędziu OnBackPressedCallback wprowadziliśmy metody handleOnBackProgressed, handleOnBackCancelled i handleOnBackStarted, które umożliwiają animowanie obiektów za pomocą przesuwania palcem do tyłu. Użyj tych metod, jeśli chcesz dostosować coś więcej niż domyślne animacje udostępniane przez system lub animacje komponentów Material.

Spodziewamy się, że większość aplikacji będzie używać interfejsów API AndroidX, które są zgodne wstecznie. Jednak w interfejsie OnBackAnimationCallback dostępne są też podobne interfejsy API platformy, które można testować w wersji Androida 14 w wersji na potrzeby programistów 1 lub nowszej.

Korzystanie z interfejsów Progress API w ramach AndroidX Transitions

Interfejsy Progress API można używać z AndroidX Transitions w wersji 1.5.0-alpha01 lub nowszej na Androidzie 14 i nowszych, aby tworzyć przejścia wstecz z wykorzystaniem przewidywania.

  1. Do odtwarzania przejść, gdy użytkownik przesuwa do tyłu, używaj TransitionManager#controlDelayedTransition zamiast beginDelayedTransition.
  2. Utwórz przejście w handleOnBackStarted.
  3. Odtwórz przejście za pomocą zdarzenia wstecz w komponentach handleOnBackProgressed, odnosząc currentFraction do BackEvent.progress, co pokazuje, jak daleko użytkownik przesunął palcem w dół.
  4. Zakończ przejście, gdy użytkownik wykona gest wstecz w aplikacji handleOnBackPressed.
  5. Na koniec zresetuj stan przejścia w handleOnBackCancelled.

Ten film oraz kod Kotlin i kod XML pokazują niestandardowe przejście między dwoma polami zaimplementowanymi za pomocą 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 korzystania z przejść prognozowanego powrotu pamiętaj o tych kwestiach:

  • Użyj isSeekingSupported, aby sprawdzić, czy przejście obsługuje funkcję przewidywania wstecz.
  • Użyj override isSeekingSupported, aby zwrócić wartość true dla niestandardowych przejść.
  • Utwórz 1 kontroler na animację.
  • Przewidywane przejścia wstecz są obsługiwane w przypadku przejścia z AndroidaX, ale nie w przypadku przejścia na inną platformę. Zrezygnuj z przejść frameworka i zamiast nich używaj przejść Animator i AndroidX.
  • Przejścia z przewidywaniem wstecz są obsługiwane na urządzeniach z Androidem 14 lub nowszym i nie są zgodne z wstecz.
  • Przejścia utworzone przy użyciu scen XML również są obsługiwane. W funkcji handleOnBackStarted ustaw argument TransitionSeekController na wartość zwracaną przez funkcję TransitionManager.createSeekController, a nie przez funkcję controlDelayedTransition.

Dodawanie przejść między aktywnościami niestandardowymi w Androidzie 14 i nowszych

Aby mieć pewność, że niestandardowe przejścia między aktywnościami będą obsługiwać funkcję przewidywanego powrotu na Androidzie 14 i nowszych wersjach, zamiast overridePendingTransition możesz użyć overrideActivityTransition. Oznacza to, że animacja przejścia jest odtwarzana, gdy użytkownik przesuwa palcem w lewo.

Aby pokazać, jak to działa, wyobraź sobie sytuację, w której aktywność B znajduje się nad aktywnością A w steku. W przypadku animacji aktywności niestandardowych należy postępować w ten sposób:

  • Wywołuj otwieranie lub zamykanie przejść w metodie onCreate w ramach 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 czynności A, użyj elementu OVERRIDE_TRANSITION_CLOSE.
  • W przypadku parametru OVERRIDE_TRANSITION_CLOSE wartość enterAnim to animacja wejścia aktywności A, a wartość exitAnim to animacja wyjścia z aktywności B.

Dodanie obsługi przewidywanego przejścia wstecz z użyciem fragmentów

Wdrożenie przewidywanego przywracania za pomocą fragmentów może odbywać się na 2 sposoby.

Korzystanie z dotychczasowych interfejsów API

Zalecamy korzystanie z istniejących interfejsów API. Te interfejsy API pozwalają sterować przejściami w animatorze lub Androidziex za pomocą gestów, przesuwając palcem od krawędzi ekranu. To, czy gest zostanie wykonany i czy wrócisz do poprzedniego fragmentu, czy zostanie anulowany i pozostaniesz na bieżącym fragmencie, zależy od tego, czy gest zostanie wykonany i czy wrócisz do poprzedniego fragmentu, czy zostanie anulowany i pozostaniesz na 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ą oraz Fragments 1.7.0 lub nowszą. Większość obsługi przewidywanego cofnięcia w Fragments opiera się na możliwości Transitions do przewijania animacji, co jest możliwe tylko w Transitions w wersji 1.5.0 lub nowszej.
  • Do obsługi sekcji Wstecz użyj fragmentów (FragmentManager) lub komponentu Nawigacja. Przewidywanie wsteczne nie jest obsługiwane, jeśli zarządzasz własnym stosem wstecznym. Przejdź do podprocesów z poziomu warstwy pośredniej, o których FragmentManager nie wie.
  • Niektóre biblioteki obsługują funkcję przewidywanego cofnięcia. Dla pewności przejrzyj dokumentację.
  • Obsługiwane są biblioteki Animator i AndroidX Transition.
  • Klasa Animation i biblioteka Transition nie są obsługiwane.
  • Animacje predykcyjne działają tylko na urządzeniach z Androidem w wersji 14 lub nowszej.

Korzystaj z funkcji przewidywania fragmentów w tle w tych sytuacjach:

Niektóre material motions obsługują funkcję przewidywania wstecz w wersji 1.12.02-alpha02 lub nowszej, w tym MaterialFadeThrough, MaterialSharedAxis i MaterialFade. Uwaga: aplikacja MaterialContainerTransform nie obsługuje funkcji prognozowania opinii.

Używanie wywołań zwrotnych

Za pomocą wywołań zwrotnych możesz tworzyć przejścia między fragmentami, ale jest też znane ograniczenie dotyczące używania wywołań zwrotnych, które polega na tym, że użytkownicy nie mogą zobaczyć poprzedniego fragmentu po przesunięciu palcem w drugą stronę. Aby utworzyć przejście między elementami współdzielonymi w różnych fragmentach, które odpowiada zaleceniom projektowym dotyczącym przewidywania:

Utwórz OnBackPressedCallback. W elemencie handleOnBackProgressed przeskaluj i przesuń fragment. Następnie wyjmij z grupy elementów. Następnie uruchom przejście elementu współdzielonego 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 przez targetSdkVersioncompileSdkVersion, wersję urządzenia, zależności, flagi manifestu i flagi fragmentu. Ta tabela odnosi się do wymagań dotyczących kodu.

Kategoria Animacja buildSdk targetSdk Wersja urządzenia android:enableOnBackInvokedCallback Zależność
Animacje systemowe Powrót do domu 33 Dowolny 35 PRAWDA Brak
Aktywność na wielu platformach 34 Dowolny 35 PRAWDA Brak
Wielozadaniowość 34 Dowolny 35 PRAWDA Brak
Platforma Niestandardowa aktywność krzyżowa 34 Dowolny 35 PRAWDA Brak
Progress API Platform 34 Dowolny 34 PRAWDA Brak
Material Components Plansza dolna 34 Dowolny 34 PRAWDA Komponent materiału 1.10.0
Arkusz boczny 34 Dowolny 34 PRAWDA Material Komponent 1.10.0
Panel nawigacji 34 Dowolny 34 PRAWDA Komponent materiału 1.10.0
Szukaj 34 Dowolny 34 PRAWDA Komponent materiału 1.10.0
Jetpack Animations Niestandardowy fragment krzyżowy AndroidX 34 Dowolny 34 PRAWDA AndroidX Fragment 1.7
Niestandardowe przejścia AndroidX 34 Dowolny 34 PRAWDA AndroidX Przenoszenie 1.5
Jetpack API postępu 34 Dowolny 34 PRAWDA AndroidX Activity 1.8

Dodatkowe materiały