Dodaj obsługę wbudowanych i niestandardowych animacji przewidywanego przejścia wstecz

Jeśli aplikacja została już przeniesiona do nowych systemowych interfejsów API, możesz włączyć funkcję przewidywania wstecznego, by automatycznie otrzymywać animacje w aplikacji i obsługiwać niestandardowe przejścia.

Dodanie obsługi wbudowanych animacji w aplikacji

Film: Animacje przewidywanego przejścia wstecz

Gdy włączysz tę funkcję, aplikacja będzie wyświetlać animacje powrotu do ekranu głównego, różnych działań i różnych zadań.

Możesz też uaktualnić zależność komponentu Material Design do wersji 1.10.0 MDC na Androida, aby otrzymywać animacje komponentów materiału podobne do tych:

Więcej informacji znajdziesz we wskazówkach dla deweloperów komponentów Material Design na GitHubie.

Na filmie widać krótki przykład animacji przewidywanego przejścia wstecz w przypadku różnych aktywności i powrotu do domu za pomocą aplikacji Ustawienia na Androidzie.

  1. W animacji użytkownik przesuwa palcem, aby wrócić do poprzedniego ekranu ustawień – przykładu animacji obejmującej różne działania.
  2. Na poprzednim ekranie użytkownik zaczyna przesuwać raz do tyłu, pokazując podgląd ekranu głównego z jej tapetą, co jest przykładem animacji powrotu do ekranu głównego.
  3. Użytkownik kontynuuje przesuwanie palcem w prawo, wyświetlając animację okna zmniejszającego się do ikony na ekranie głównym.
  4. Użytkownik wrócił teraz do ekranu głównego.

Dowiedz się więcej o obsłudze funkcji przewidywania wstecznego.

Dodaj niestandardowe przejścia i animacje w aplikacji

Możesz tworzyć niestandardowe animacje i przejścia właściwości w aplikacji za pomocą interfejsu Progress API i niestandardowej metody animacji overrideActivityTransition.

Dodaj niestandardowe przejścia za pomocą interfejsu Progress API

Dzięki aktywności w AndroidzieX w wersji 1.8.0-alfa01 lub nowszej możesz używać interfejsów API prognozowania wstecznego, by tworzyć niestandardowe animacje dla gestu przewidywanego przejścia wstecz w aplikacji. W OnBackPressedCallback wprowadziliśmy metody handleOnBackProgressed, handleOnBackCancelled i handleOnBackStarted do animowania obiektów, gdy użytkownik przesuwa palcem do tyłu. Użyj tych metod, jeśli potrzebujesz czegoś bardziej niestandardowego niż domyślne animacje zapewniane przez nowe animacje systemowe lub animacje komponentu Materiał.

Spodziewamy się, że większość aplikacji będzie używać zgodnych wstecznie interfejsów API AndroidaX, ale w interfejsie OnBackAnimationCallback dostępne są też podobne interfejsy API platformy do testowania w wersji przedpremierowej 1 dla programistów Androida 14 i nowszych.

Korzystanie z interfejsów Progress API w ramach przejścia na AndroidaX

Interfejsów Progress API można używać z przejściami z Androidem 1.5.0-alfa01 lub nowszym na Androidzie 14 i nowszych, aby tworzyć przejścia z wyprzedzeniem.

  1. Aby odtwarzać przejścia, gdy użytkownik przesuwa palcem do tyłu, użyj narzędzia TransitionManager#controlDelayedTransition zamiast beginDelayedTransition.
  2. Utwórz przejście w ciągu handleOnBackStarted.
  3. Odtwórz przejście za pomocą zdarzenia wstecz w obrębie handleOnBackProgressed, przypisując parametr currentFraction do BackEvent.progress, który pokazuje, jak daleko użytkownik przesunął się do tyłu.
  4. Dokończ przenoszenie, gdy użytkownik potwierdzi gest cofania w handleOnBackPressed.
  5. Na koniec zresetuj stan przejścia w ciągu handleOnBackCancelled.

W tym filmie, kodzie Kotlin i w formacie XML pokazano niestandardowe przejście między 2 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 pracy z przejściami typu predykcja wsteczna pamiętaj o tych kwestiach:

  • Użyj funkcji isSeekingSupported, aby sprawdzić, czy przejście obsługuje funkcję przewidywania wstecznego.
  • Zastąp isSeekingSupported, aby zwracać wartość „prawda” w przypadku niestandardowych przejść.
  • Utwórz po 1 kontrolerze na animację.
  • Przejścia z wyprzedzeniem są obsługiwane w przypadku przejścia na AndroidaX, ale nie w przypadku przejścia na platformę. Zalecamy przejście z innych platform.
  • Przewidywanie przejścia do tyłu jest obsługiwane na urządzeniach z Androidem 14 lub nowszym i nie jest zgodne wstecznie.
  • Przejścia utworzone za pomocą scen XML są również obsługiwane. W funkcji handleOnBackStarted ustaw TransitionSeekController na wynik TransitionManager.createSeekController, a nie controlDelayedTransition.

Dodawanie niestandardowych przeniesień aktywności w Androidzie 14 i nowszych

Aby mieć pewność, że niestandardowe przeniesienie aktywności obsługuje przewidywanie wsteczne na Androidzie 14 i nowszych, możesz użyć overrideActivityTransition zamiast overridePendingTransition. Oznacza to, że animacja przejścia odtwarza się, gdy użytkownik przesuwa do tyłu.

Aby podać przykład, jak to może działać, wyobraźmy sobie scenariusz, w którym Działanie B jest nadrzędne dla Aktywności A w stosie wstecznym. W takim przypadku postępujesz z niestandardowymi animacjami aktywności w taki sposób:

  • Wywołaj przejście w ramach metody onCreate działania B.
  • Gdy użytkownik przejdzie 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.
  • Gdy określisz właściwość OVERRIDE_TRANSITION_CLOSE, enterAnim będzie animacją wejścia dla działania A, a exitAnim to animacja wyjściowa działania B.