Dodanie obsługi wbudowanych i niestandardowych animacji przewidywanego przejścia wstecz

Jeśli aplikacja została już przeniesiona na nowe interfejsy API do wstecznego wywołania systemu, możesz włączyć wsteczne wywołanie przewidujące, aby automatycznie otrzymywać animacje w aplikacji i obsługiwać przejścia niestandardowe.

Dodawanie obsługi wbudowanych animacji w aplikacji

Wideo: animacje przewidywanego przejścia wstecz

Gdy włączysz tę funkcję, aplikacja będzie wyświetlać animacje powrót do strony głównej, i wielozadaniowość.

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 materiałów na GitHubie.

Film przedstawia krótki przykład animacji sygnalizujących powrót do strony do wielu aktywności i powrót do domu w aplikacji Ustawienia na Androidzie.

  1. W animacji użytkownik przesuwa palcem, aby wrócić do poprzedniego ekranu ustawień – przykład animacji obejmującej różne czynności.
  2. Na poprzednim ekranie użytkownik zaczyna przesuwać palcem w drugą stronę, co powoduje wyświetlenie podglądu ekranu głównego z tapetą – przykład animacji powrotu do ekranu głównego.
  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 wspieraniu funkcji przewidywania tekstu wstecz.

Dodawanie niestandardowych przejść i animacji w aplikacji

Możesz tworzyć niestandardowe animacje i przejścia w usłudze w aplikacji za pomocą interfejsu Progress API i niestandardowej metody animacji między działaniami.overrideActivityTransition

Dodawanie niestandardowych przejść za pomocą interfejsu Progress API

W wersji 1.8.0-alpha01 lub nowszej pakietu AndroidX Activity możesz używać interfejsów API Progresja przewidującego powrotu, aby tworzyć niestandardowe animacje przewidującego gestu powrotu w aplikacji. W wersji OnBackPressedCallback dodaliśmy metody handleOnBackProgressed, handleOnBackCancelledhandleOnBackStarted, które służą do animowania obiektów podczas przesuwania palcem w kierunku wyjścia. Używaj jeśli potrzebujesz bardziej niestandardowych animacji niż domyślne: dostarczane przez nowe animacje systemowe lub animacje komponentu Material Material.

Spodziewamy się, że większość aplikacji będzie korzystać ze zgodnych wstecznie interfejsów API AndroidaX, ale także interfejsami API podobnych platform w ramach OnBackAnimationCallback interfejs dostępny do testowania w wersji przedpremierowej dla programistów Androida 14 w wersji 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 lub nowszym, aby tworzyć przejścia z funkcją przewidywania wstecznego.

  1. Użyj TransitionManager#controlDelayedTransition zamiast beginDelayedTransition, aby odtwarzać przejścia jako: użytkownik przesunie palcem do tyłu.
  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 przewinął ekran w kierunku Wstecz.
  4. Zakończ przenoszenie po zatwierdzeniu gestu cofania przez użytkownika handleOnBackPressed
  5. Na koniec zresetuj stan przejścia w handleOnBackCancelled.

Na tym filmie, w kodzie Kotlina i pliku XML demonstrujemy przejście między 2 polem zaimplementowane 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 prognozowanym przejściem wstecznym pamiętaj o tych kwestiach:

  • Użyj isSeekingSupported, aby sprawdzić, czy przejście obsługuje funkcję przewidywania wstecz.
  • Zastąp isSeekingSupported, aby niestandardowych przejściach zwracać wartość „prawda”.
  • Utwórz po 1 kontrolerze na każdą animację.
  • Przewidywane przejścia wstecz są obsługiwane w przypadku przejścia na AndroidaX. ale nie w przypadku przejścia na nową platformę. Zalecamy odejście od platformy przejścia.
  • Przejścia wstecz oparte na przewidywaniu są obsługiwane na urządzeniach z Androidem 14 lub nowszym i nie są zgodne z wersjami starszymi.
  • Przejścia utworzone przy użyciu scen XML również są obsługiwane. W handleOnBackStarted, ustaw TransitionSeekController na wynik TransitionManager.createSeekController zamiast wyniku controlDelayedTransition.

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

Aby mieć pewność, że niestandardowe przejścia w Aktywności obsługują funkcję przewidywania powrotu w Androidzie 14 i nowszych wersjach, możesz użyć overrideActivityTransition zamiast overridePendingTransition. Oznacza to, że animacja przejścia jest odtwarzana jako użytkownik przesunie palcem do tyłu.

Aby podać przykład, jak to może działać, wyobraźmy sobie scenariusz, w którym Ćwiczenie B znajduje się nad Aktywnością A z tyłu. Zajmujesz się personalizacją Animacje aktywności:

  • Wywołaj przejścia otwierające lub zamykające w onCreate aktywności B. .
  • Gdy użytkownik przechodzi do aktywności B, użyj OVERRIDE_TRANSITION_OPEN. Kiedy użytkownik przesuwa palcem, aby wrócić do aktywności A, użyj 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.