Dodano obsługę animacji przewidywanego przejścia wstecz

Podczas korzystania z systemowych interfejsów API, możesz wyrazić zgodę na otrzymywanie animacji w aplikacji i obsługują niestandardowe przejścia.

.
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ż uaktualnić zależność komponentów Material Design do wersji 1.10.0 MDC Android może odbierać animacje komponentu Materiał, takie jak:

Zapoznaj się ze wskazówkami dla deweloperów dotyczącymi komponentów materiałów na GitHubie, znajdziesz więcej informacji.

Film przedstawia krótki przykład animacji przejścia wstecz w przypadku do wielu aktywności i powrót do domu w aplikacji Ustawienia na Androidzie.

  1. W animacji użytkownik przesuwa palcem z powrotem, aby wrócić do poprzednich ustawień. screen – przykład animacji przedstawiającej różne aktywności.
  2. Na poprzednim ekranie użytkownik zaczyna przesuwać palcem po raz drugi, podgląd ekranu głównego z tapetą (przykład: animację powrotu na stronę główną.
  3. Użytkownik nadal przesuwa w prawo, pokazując animację okna. 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 tym, jak dodać obsługę przewidywania gestów cofania.

Dodawanie niestandardowych przejść i animacji w aplikacji

Możesz tworzyć niestandardowe animacje i przejścia w aplikacji, niestandardowe animacje obejmujące różne aktywności i niestandardowe animacje złożone z fragmentów o funkcji predykcyjnej gestami wstecz.

Dodawanie niestandardowych przejść za pomocą interfejsu Progress API

W AndroidX Activity w wersji 1.8.0-alfa01 lub nowszej możesz używać funkcji przewidywania Interfejsy API postępu umożliwiające tworzenie niestandardowych animacji gestu przewidywania tekstu wstecz w aplikacji. Interfejsy API postępu pomagają animować widoków, ale mają ograniczenia związane z animowaniem przejść między fragmentami. W ciągu OnBackPressedCallback wprowadziliśmy handleOnBackProgressed, handleOnBackCancelled oraz handleOnBackStarted metody animowania obiektów, gdy użytkownik przesuwa palcem do tyłu. Skorzystaj z tych metod, jeśli: chcesz dostosować bardziej niż domyślne animacje udostępniane przez system. animacje komponentu 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 przypadku przejść z AndroidemX

Interfejsów Progress API można używać z AndroidX Migrates w wersji 1.5.0-alpha01 lub nowszej w Androidzie 14 i nowszych, aby tworzyć przewidywane przejścia wstecz.

  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 usłudze handleOnBackStarted.
  3. Odtwórz przejście ze zdarzeniem wstecz w ciągu handleOnBackProgressed do dotyczące: currentFraction i BackEvent.progress, co pokazuje, jak daleko użytkownik przesunął palcem do tyłu.
  4. Zakończ przenoszenie po zatwierdzeniu gestu cofania przez użytkownika handleOnBackPressed
  5. Na koniec zresetuj stan przejścia w usłudze handleOnBackCancelled.

Niestandardowe przejście pokazano w poniższym filmie, kodzie Kotlin i XML między dwoma polami zaimplementowanymi za pomocą algorytmu 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 funkcji 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 animację.
  • Przewidywane przejścia wstecz są obsługiwane w przypadku przejścia w AndroidzieX, ale nie w przypadku przejścia na nową platformę. Zalecamy odejście od platformy przejścia.
  • Przewidywanie przejścia wstecz jest obsługiwane na urządzeniach z Androidem 14 oraz i nie są zgodne wstecznie.
  • 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 przenoszenie aktywności będzie obsługiwać funkcję przewidywania zmian w Androidzie 14 lub wyższej, możesz używać 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 przejdzie do Aktywności B, użyj polecenia OVERRIDE_TRANSITION_OPEN. Kiedy użytkownik przesuwa palcem, aby wrócić do aktywności A, użyj OVERRIDE_TRANSITION_CLOSE
  • Przy określaniu OVERRIDE_TRANSITION_CLOSE enterAnim jest aktywności A wprowadź animację, a exitAnim to animacja wyjścia aktywności B.

Dodanie obsługi prognozowania wstecznego z fragmentami

Istnieją 2 sposoby implementowania prognozowania zwrotnego z fragmentami.

Użyj istniejących interfejsów API

Zalecamy korzystanie z istniejących interfejsów API. Te interfejsy API umożliwiają przechodzenie aby manipulować przejściami w animatorze lub Androidziex za pomocą przycisku gest. To, czy przekroczysz próg, decyduje o tym, zakończy się i nastąpi powrót do poprzedniego fragmentu. Ewentualnie następuje anulowanie na obecnym fragmencie. Więcej informacji: Poruszaj się po fragmentach za pomocą animacji.

Pamiętaj o tych kwestiach:

  • Importuj Przejścia 1.5.0 lub później i Fragmenty 1.7.0 czy później. Znaczna część predykcyjnego wsparcia pierwiastka w przypadku fragmentów kodu zależy od Przejścia mogą przewijać animacje, co jest możliwe tylko w Przejścia w wersji 1.5.0 lub nowszej.
  • Używaj fragmentów z parametrem FragmentManager lub Komponent nawigacyjny służący do obsługi stosu wstecznego. Przewidujące Powrót nie jest obsługiwany, jeśli zarządzasz własnym stosem wstecznym.
  • Niektóre biblioteki obsługują funkcję predykcyjnej pleców. Sprawdź dokumentację, która ma być jasne.
  • zajęcia Animator oraz AndroidX Transition biblioteka jest obsługiwane.
  • Biblioteka klas Animation i biblioteka Transition nie są obsługiwane.
  • Animacje prognozowane działają tylko na urządzeniach z Androidem 14 lub nowszym.

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

Niektóre ruchy materiału i obsługują prognozowanie wsteczne od 1.12.02-alfa02 lub wyższe, w tym MaterialFadeThrough, MaterialSharedAxis i MaterialFade Uwaga: MaterialContainerTransform nie obsługuje prognozowania z powrotem.

Korzystanie z wywołań zwrotnych

Można utworzyć przejście między fragmentami za pomocą wywołań zwrotnych, ale istnieje znane ograniczenie w przypadku używania wywołań zwrotnych, w których użytkownicy nie widzą poprzedniego fragment po przesuwaniu do tyłu. Aby utworzyć przejście udostępnianych elementów z wielu fragmentów która odpowiada przewidywanej wstecznej wskazówek dotyczących projektowania, :

Utwórz OnBackPressedCallback. W obrębie handleOnBackProgressed skaluj przesuń fragment. Potem wyskocz z tylnego stosu. Następnie uruchom udostępniony element przejście za pomocą parametru setSharedElementReturnTransition poza wywołaniem zwrotnym.

Więcej informacji znajdziesz w przykładowym kodzie na GitHubie.

Wymagania

W tabelach poniżej znajdziesz informacje o elementach kontrolowanych przez opcje programisty: targetSdkVersion i compileSdkVersion, wersja urządzenia, zależności, w pliku manifestu i flagi fragmentów. Pierwsza tabela dotyczy wymagań kodu.

Kategoria Animacja buildSdk docelowy pakiet SDK android:enableOnBackInvokedCallback, Zależność
Animacje systemowe Powrót do domu 33 Dowolny PRAWDA Brak
Wzajemna aktywność 34 Dowolny PRAWDA Brak
Wielozadaniowość 34 Dowolny PRAWDA Brak
Platforma Niestandardowa aktywność krzyżowa 34 Dowolny PRAWDA Brak
Platforma interfejsu Progress API 34 Dowolny PRAWDA Brak
Składniki materiałowe Plansza dolna 34 Dowolny PRAWDA Material Komponent 1.10.0
Arkusz boczny 34 Dowolny PRAWDA Material Komponent 1.10.0
Panel nawigacji 34 Dowolny PRAWDA Material Komponent 1.10.0
Szukaj 34 Dowolny PRAWDA Material Komponent 1.10.0
Animacje Jetpack Niestandardowy fragment o wielu fragmentach w AndroidzieX 34 Dowolny PRAWDA Fragment AndroidaX 1.7
Niestandardowe przejścia z AndroidaX 34 Dowolny PRAWDA AndroidX Przenoszenie 1.5
Jetpack z interfejsem Progress API 34 Dowolny PRAWDA Aktywność w Androidzie 1.8

Tabela poniżej zawiera wymagania, które pozwalają użytkownikom oglądać animacje.

Kategoria Animacja Opcja programisty włączona Wersja urządzenia
Animacje systemowe Powrót do domu PRAWDA 33
Wzajemna aktywność PRAWDA 34
Wielozadaniowość PRAWDA 34
Platforma Niestandardowa aktywność krzyżowa PRAWDA 34
Platforma interfejsu Progress API FAŁSZ 34
Składniki materiałowe Plansza dolna FAŁSZ 34
Arkusz boczny FAŁSZ 34
Panel nawigacji FAŁSZ 34
Szukaj FAŁSZ 34
Animacje Jetpack Niestandardowy fragment o wielu fragmentach w AndroidzieX FAŁSZ 34
Niestandardowe przejścia z AndroidaX FAŁSZ 34
Jetpack z interfejsem Progress API FAŁSZ 34

Dodatkowe materiały