Tworzenie pięknych przejść dzięki Material Motion na Androida

1. Wprowadzenie

Material Design to system do tworzenia odważnych i atrakcyjnych produktów cyfrowych. Łącząc styl, budowanie marki, interakcję i ruch w ramach spójnego zestawu zasad i komponentów, zespoły zajmujące się poszczególnymi produktami i usługami mogą w pełni wykorzystać swój potencjał projektowy.

logo_components_color_2x_web_96dp.png

Material Komponenty (MDC) pomagają deweloperom wdrażać interfejs Material Design. MDC, stworzona przez zespół inżynierów i projektantów UX w Google, zawiera dziesiątki pięknych i funkcjonalnych komponentów interfejsu. Jest dostępny na Androida, iOS, internet oraz Flutter.material.io/develop

Czym jest system animacji Material Design na Androida?

System Material Motion na Androida to zbiór wzorców przejść w bibliotece MDC-Android, który może pomóc użytkownikom zrozumieć aplikację i poruszać się po niej, zgodnie z wytycznymi Material Design.

Oto 4 główne wzorce przejść z użyciem materiału:

  • Przekształcenie kontenera: przejścia między elementami interfejsu, które zawierają kontener. tworzy widoczne połączenie między dwoma różnymi elementami interfejsu, płynnie przekształcając jeden element w drugi.
  • Wspólna oś: przejścia między elementami interfejsu, które są powiązane przestrzenną lub nawigacyjną. korzysta z udostępnianego przekształcenia na osi x, y lub z, aby wzmocnić relacje między elementami.
  • Przenikanie: przejścia między elementami interfejsu, które nie są ze sobą ściśle powiązane. używa sekwencyjnego zanikania i zanikania ze skalą elementu przychodzącego.
  • Zanikanie: opcja używana w przypadku elementów interfejsu, które pojawiają się lub znikają na ekranie.

Biblioteka MDC-Android zawiera klasy przejść dla tych wzorców, utworzone na podstawie biblioteki AndroidX Migrate (androidx.transition) oraz Android Przenoszenie Framework (android.transition):

AndroidX

  • Dostępne w pakiecie com.google.android.material.transition
  • Obsługuje interfejs API poziomu 14 lub nowszego
  • Obsługuje fragmenty i wyświetlenia, ale nie Aktywności ani Windowsa.
  • Zawiera wycofane poprawki błędów i spójne działanie na różnych poziomach interfejsu API

Struktura

  • Dostępne w pakiecie com.google.android.material.transition.platform
  • Obsługuje interfejs API poziomu 21 lub nowszego
  • Obsługuje fragmenty, widoki, aktywności i okna
  • Poprawki błędów nie zostały przeniesione i mogą różnić się w zależności od poziomu interfejsu API

W tym ćwiczeniu w Codelabs będziesz używać przejścia Material Design, które są oparte na bibliotece AndroidaX. Oznacza to, że skupisz się głównie na fragmentach i widokach danych.

Co utworzysz

Dzięki temu ćwiczeniu w Codelabs dowiesz się, jak tworzyć przejścia z przykładowej aplikacji e-mail na Androida o nazwie Reply z użyciem Kotlin. Pokażemy Ci, jak korzystać z przejścia z biblioteki MDC-Android do dostosowania wyglądu i sposobu działania aplikacji.

Otrzymasz kod startowy aplikacji Reply, a Ty wykorzystasz w niej te przejścia Material Design, które możesz zobaczyć w tym GIF-ie z ukończonego ćwiczenia w Codelabs:

  • Przejście ze przekształcenia kontenera ze strony listy e-mailowej na stronę z informacjami o e-mailu
  • Przejście ze Przekształcenia kontenera ze strony typu FAB na stronę tworzenia e-maila
  • Wspólna oś Z – przejście z ikony wyszukiwania na stronę widoku wyszukiwania
  • Przejście zanikanie przez strony skrzynki pocztowej
  • Przejście z przekształcenia kontenera z elementu adresu e-mail na widok karty

Domena żądanego elementu iframe (youtu.be) nie została dodana do białej listy.

Czego potrzebujesz

  • Podstawowa wiedza o programowaniu na Androida i Kotlin
  • Android Studio (pobierz tę aplikację stąd, jeśli jeszcze jej nie masz)
  • Emulator Androida lub urządzenie (dostępne w Android Studio).
  • Przykładowy kod (patrz następny krok)

Jak oceniasz swój poziom doświadczenia w tworzeniu aplikacji na Androida?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfigurowanie środowiska programistycznego

Uruchamianie Androida Studio

Gdy otworzysz Android Studio, powinno wyświetlić się okno „Welcome to Android Studio”. Jeśli jednak uruchamiasz Androida Studio po raz pierwszy, wykonaj czynności opisane w kreatorze konfiguracji Android Studio, używając wartości domyślnych. Pobranie i zainstalowanie niezbędnych plików może potrwać kilka minut, więc w każdej sekcji możesz pozostawić je uruchomione w tle.

Opcja 1. Sklonowanie z GitHuba aplikacji startowej z programowania

Aby skopiować to ćwiczenie z programowania z GitHuba, uruchom te polecenia:

git clone https://github.com/material-components/material-components-android-motion-codelab.git
cd material-components-android-motion-codelab

Opcja 2. Pobierz plik ZIP aplikacji startowej z programowania

Aplikacja startowa znajduje się w katalogu material-components-android-motion-codelab-develop.

Wczytywanie kodu startowego w Android Studio

  1. Gdy kreator zakończy konfigurację i wyświetli się okno Witamy w Android Studio, kliknij Otwórz istniejący projekt Android Studio.

e3f200327a67a53.png

  1. Przejdź do katalogu, w którym został zainstalowany przykładowy kod, i wybierz katalog przykładowy, aby otworzyć projekt.
  2. Poczekaj, aż Android Studio skompiluje i zsynchronizuje projekt, zgodnie ze wskaźnikami aktywności u dołu okna Android Studio.
  1. W tym momencie Android Studio może zgłaszać błędy kompilacji, ponieważ brakuje w nim pakietu Android SDK lub narzędzi do kompilacji, takich jak ten poniżej. Postępuj zgodnie z instrukcjami w Android Studio, aby zainstalować lub zaktualizować te aplikacje i zsynchronizować projekt. Jeśli nadal masz problemy, postępuj zgodnie z instrukcjami podanymi w przewodniku dotyczącym aktualizowania narzędzi za pomocą Menedżera SDK.

6e026ae171f5b1eb.png

Sprawdzanie zależności projektu

Projekt wymaga zależności od biblioteki MDC-Android. Ta zależność powinna już być widoczna w pobranym przykładowym kodzie, ale przyjrzyjmy się konfiguracji, aby się upewnić.

Przejdź do pliku build.gradle modułu app i upewnij się, że blok dependencies zawiera zależność od MDC-Android:

implementation 'com.google.android.material:material:1.2.0'

Uruchamianie aplikacji startowej

  1. Upewnij się, że konfiguracja kompilacji po lewej stronie wybranego urządzenia to app.
  2. Aby skompilować i uruchomić aplikację, naciśnij zielony przycisk Uruchom / Graj.

24218d0a6ae25803.png

  1. Jeśli masz już urządzenie z Androidem na liście dostępnych urządzeń, w oknie Wybierz cel wdrożenia przejdź do kroku 8. W przeciwnym razie kliknij Create New Virtual Device (Utwórz nowe urządzenie wirtualne).
  2. Na ekranie Wybierz sprzęt wybierz telefon, na przykład Pixel 3, i kliknij Dalej.
  3. Na ekranie Obraz systemu wybierz najnowszą wersję Androida, najlepiej najwyższy poziom interfejsu API. Jeśli aplikacja nie jest zainstalowana, kliknij widoczny link Pobierz i dokończ pobieranie.
  4. Kliknij Dalej.
  5. Na ekranie Urządzenie wirtualne z Androidem (AVD) pozostaw ustawienia bez zmian i kliknij Zakończ.
  6. W oknie docelowym wdrożenia wybierz urządzenie z Androidem.
  7. Kliknij OK.
  8. Android Studio kompiluje aplikację, wdraża ją i automatycznie otwiera na urządzeniu docelowym.

Gotowe! Kod startowy strony głównej Reply powinien być uruchomiony w Twoim emulatorze. Powinna wyświetlić się skrzynka odbiorcza z listą e-maili.

cc73eb0d0f779035.png

Opcjonalnie: spowalnianie animacji na urządzeniu

Ponieważ ćwiczenie w Codelabs wymaga szybkich, ale dopracowanych przejść, warto spowolnić animacje na urządzeniu, aby zobaczyć najdrobniejsze szczegóły przejść. Można to zrobić za pomocą poleceń powłoki adb lub kafelka Szybkich ustawień. Pamiętaj, że te metody spowalniania animacji mają też wpływ na animacje na urządzeniu poza aplikacją Reply.

Metoda 1. Polecenia powłoki ADB

Aby 10-krotnie spowolnić animacje na urządzeniu, możesz uruchomić te polecenia w wierszu poleceń:

adb shell settings put global window_animation_scale 10
adb shell settings put global transition_animation_scale 10
adb shell settings put global animator_duration_scale 10

Aby przywrócić normalne działanie animacji na urządzeniu, uruchom te polecenia:

adb shell settings put global window_animation_scale 1
adb shell settings put global transition_animation_scale 1
adb shell settings put global animator_duration_scale 1

Metoda 2. Kafelek Szybkich ustawień

Aby skonfigurować kafelek Szybkich ustawień, możesz też najpierw włączyć na urządzeniu ustawienia programisty:

  1. Otwórz „Ustawienia” urządzenia. aplikacja
  2. Przewiń w dół i kliknij „Informacje o emulowanym urządzeniu”.
  3. Przewiń w dół i szybko kliknij „Numer kompilacji”. dopóki nie włączysz ustawień programisty

Następnie wykonaj te czynności, wciąż w „Ustawieniach” urządzenia. , aby włączyć kafelek Szybkich ustawień:

  1. Kliknij ikonę wyszukiwania lub pasek wyszukiwania u góry ekranu.
  2. Wpisz „kafelki” w polu wyszukiwania
  3. Kliknij „kafelki Szybkich ustawień dla dewelopera”. wiersz
  4. Kliknij „Skala animacji okna”. Przełącz

Na koniec podczas ćwiczenia w programowaniu wysuń obszar powiadomień systemowych z góry ekranu i za pomocą ikony c7e3f98200023f6a.png przełącz się między animacjami o niskiej i normalnej szybkości.

3. Zapoznaj się z kodem przykładowej aplikacji

Spójrzmy na kod. Opublikowaliśmy aplikację, która wykorzystuje bibliotekę Jetpack Navigation komponentu do przechodzenia między kilkoma różnymi fragmentami kodu w ramach jednej aktywności MainActivity:

  • HomeFragment: wyświetla listę adresów e-mail.
  • EmailFragment: pojedynczy, pełny e-mail;
  • ComposeFragment: umożliwia tworzenie nowego e-maila.
  • SearchFragment: wyświetla widok wyszukiwania.

Aby dowiedzieć się, jak skonfigurowano wykres nawigacji w aplikacji, otwórz plik navigation_graph.xml w katalogu app -> src -> main -> res -> navigation:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/navigation_graph"
   app:startDestination="@id/homeFragment">

   <fragment
       android:id="@+id/homeFragment"
       android:name="com.materialstudies.reply.ui.home.HomeFragment"
       android:label="HomeFragment">
       <argument...>
       <action
           android:id="@+id/action_homeFragment_to_emailFragment"
           app:destination="@id/emailFragment" />
   </fragment>
   <fragment
       android:id="@+id/emailFragment"
       android:name="com.materialstudies.reply.ui.email.EmailFragment"
       android:label="EmailFragment">
       <argument...>
   </fragment>
   <fragment
       android:id="@+id/composeFragment"
       android:name="com.materialstudies.reply.ui.compose.ComposeFragment"
       android:label="ComposeFragment">
       <argument...>
   </fragment>
   <fragment
       android:id="@+id/searchFragment"
       android:name="com.materialstudies.reply.ui.search.SearchFragment"
       android:label="SearchFragment" />
   <action
       android:id="@+id/action_global_homeFragment"
       app:destination="@+id/homeFragment"
       app:launchSingleTop="true"
       app:popUpTo="@+id/navigation_graph"
       app:popUpToInclusive="true"/>
   <action
       android:id="@+id/action_global_composeFragment"
       app:destination="@+id/composeFragment" />
   <action
       android:id="@+id/action_global_searchFragment"
       app:destination="@+id/searchFragment" />
</navigation>

Zwróć uwagę na to, że obecne są wszystkie wymienione powyżej fragmenty, a domyślny fragment uruchamiania jest ustawiony na HomeFragment w app:startDestination="@id/homeFragment". Ta definicja XML wykresu docelowego fragmentu, jak również działania, zawiera informacje dla wygenerowanego kodu nawigacyjnego Kotlin, który napotkasz podczas podłączania przejść.

activity_main.xml

Następnie przyjrzyj się układowi activity_main.xml w katalogu app -> src -> main -> res -> layout. Zobaczysz sekcję NavHostFragment skonfigurowaną za pomocą powyższego wykresu nawigacyjnego:

<fragment
   android:id="@+id/nav_host_fragment"
   android:name="androidx.navigation.fragment.NavHostFragment"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:defaultNavHost="true"
   app:navGraph="@navigation/navigation_graph"/>

Ten element NavHostFragment wypełnia ekran i obsługuje wszystkie zmiany dotyczące pełnoekranowej nawigacji po fragmentach w aplikacji. Komponent BottomAppBar i jego zakotwiczone FloatingActionButton (również w języku: activity_main.xml) są układane nad bieżącym fragmentem wyświetlanym przez interfejs NavHostFragment i dlatego będą wyświetlane lub ukryte w zależności od miejsca docelowego fragmentu w przykładowym kodzie aplikacji.

Dodatkowo BottomNavDrawerFragment w usłudze activity_main.xml to dolna szuflada zawierająca menu umożliwiające przełączanie się między różnymi skrzynkami pocztowymi. Jest ono warunkowo wyświetlane przy użyciu przycisku logo odpowiedzi BottomAppBar.

MainActivity.kt

Aby zobaczyć przykładowe działanie nawigacji, otwórz plik MainActivity.kt w katalogu app -> src -> main -> java -> com.materialstudies.reply.ui. Znajdź funkcję navigateToSearch(). Powinna wyglądać tak:

private fun navigateToSearch() {
   val directions = SearchFragmentDirections.actionGlobalSearchFragment()
   findNavController(R.id.nav_host_fragment).navigate(directions)
}

Tutaj możesz zobaczyć, jak możesz przejść do strony widoku wyszukiwania bez niestandardowych przejść. Podczas tego ćwiczenia w programie zagłębisz się w MainActivity w Reply, i omówisz 4 główne fragmenty, aby skonfigurować przejścia w materiałach, które będą współpracowały z różnymi działaniami nawigacyjnymi w aplikacji.

Teraz, gdy znasz już kod startowy, zaimplementujmy pierwsze przejście.

4. Dodaj przejście z listy e-mailowej na stronę z informacjami o e-mailu w ramach transformacji kontenera

Najpierw musisz dodać przejście po kliknięciu e-maila. Na potrzeby tej zmiany nawigacji dobrze sprawdza się wzorzec przekształcenia kontenera, ponieważ służy do przejść między elementami interfejsu, które zawierają kontener. Ten wzorzec tworzy widoczne połączenie między 2 elementami interfejsu.

Zanim dodasz kod, uruchom aplikację Reply i kliknij e-maila. Powinien wykonać proste cięcie skokowe, co oznacza, że ekran będzie zastępowany brakiem przejścia:

f0e8a92eb2216bce.gif

Zacznij od dodania atrybutu transitionName do elementu MaterialCardView w pliku email_item_layout.xml, jak w tym fragmencie:

email_item_layout.xml

android:transitionName="@{@string/email_card_transition_name(email.id)}"

Nazwa przejścia przyjmuje zasób ciągu znaków z parametrem. Musisz użyć identyfikatora każdego adresu e-mail, aby mieć pewność, że każdy transitionName w naszym EmailFragment jest unikalny.

Masz już ustawioną nazwę przejścia elementu listy e-mailowej, więc zróbmy to samo w układzie szczegółów e-maila. W narzędziu fragment_email.xml ustaw transitionName obiektu MaterialCardView na ten zasób ciągu znaków:

fragment_email.xml

android:transitionName="@string/email_card_detail_transition_name"

W usłudze HomeFragment.kt zastąp kod w polu onEmailClicked poniższym fragmentem, aby utworzyć mapowanie z widoku początkowego (elementu listy e-mailowej) i widoku końcowego (ekranu z informacjami e-mail):

HomeFragment.kt

val emailCardDetailTransitionName = getString(R.string.email_card_detail_transition_name)
val extras = FragmentNavigatorExtras(cardView to emailCardDetailTransitionName)
val directions = HomeFragmentDirections.actionHomeFragmentToEmailFragment(email.id)
findNavController().navigate(directions, extras)

Po skonfigurowaniu instalacji hydraulicznej możesz utworzyć przekształcenie kontenera. W metodzie EmailFragment onCreate ustaw sharedElementEnterTransition na nowe wystąpienie MaterialContainerTransform (importując wersję com.google.android.material.transition zamiast com.google.android.material.transition.platform), dodając ten fragment kodu:

EmailFragment.kt

sharedElementEnterTransition = MaterialContainerTransform().apply {
   drawingViewId = R.id.nav_host_fragment
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   scrimColor = Color.TRANSPARENT
   setAllContainerColors(requireContext().themeColor(R.attr.colorSurface))
}

Teraz spróbuj ponownie uruchomić aplikację.

ed62cedec31da268.gif

Wszystko zaczyna się wyświetlać. Gdy klikniesz e-maila na liście e-maili, przekształcenie kontenera powinno rozwinąć element listy do pełnoekranowej strony z informacjami. Pamiętaj jednak, że naciśnięcie Wstecz nie powoduje zwijania e-maila z powrotem na listę. Dodatkowo lista e-mailowa znika natychmiast na początku przejścia i ma szare tło okna. To jeszcze nie koniec.

Aby poprawić przejście powrotne, dodaj do metody onViewCreated w elemencie HomeFragment.kt te 2 wiersze:

HomeFragment.kt

postponeEnterTransition()
view.doOnPreDraw { startPostponedEnterTransition() }

Spróbuj ponownie uruchomić aplikację. Po otwarciu e-maila naciśnięcie przycisku Wstecz spowoduje zwinięcie go z powrotem na listę. Super! Ulepszamy animację.

Problem z listą e-mailową wynika z tego, że podczas przechodzenia do nowego fragmentu przy użyciu komponentu nawigacji obecny fragment jest natychmiast usuwany i zastępowany nowym, przychodzącym fragmentem. Aby lista e-mailowa była widoczna nawet po zastąpieniu, możesz dodać przejście wyjściowe do HomeFragment.

Dodaj poniższy fragment kodu do metody HomeFragment onEmailClicked, aby lista adresów e-mail była subtelnie skalowana w poziomie przy wychodzeniu i z powrotem przy otwieraniu:

HomeFragment.kt

exitTransition = MaterialElevationScale(false).apply {
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
}
reenterTransition = MaterialElevationScale(true).apply {
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
}

Aby przejście MaterialElevationScale zostało zastosowane do całego ekranu głównego, a nie do poszczególnych widoków w hierarchii, oznacz RecyclerView w elemencie fragment_home.xml jako grupę przejścia.

fragment_home.xml

android:transitionGroup="true"

Na tym etapie powinno być w pełni działające przekształcenie kontenera. Kliknięcie e-maila powoduje rozwinięcie pozycji na liście do ekranu szczegółów, a jednocześnie cofanie się listy. Naciśnięcie przycisku wstecz zwija ekran ze szczegółami e-maila z powrotem do elementu listy i skaluje go w górę na liście e-maili.

9df2b39d5a150418.gif

5. Dodaj przejście przekształcenia kontenera ze strony typu FAB na stronę tworzenia e-maila

Wróćmy do przekształcenia kontenera i dodamy przejście z pływającego przycisku polecenia do elementu ComposeFragment, rozwijając przycisk PPP do nowego e-maila do napisania przez użytkownika. Najpierw uruchom aplikację ponownie i kliknij przycisk FAB, aby zobaczyć, że po uruchomieniu ekranu tworzenia e-maila nie ma żadnego przejścia.

d242c9708abd382c.gif

Mimo że używamy tej samej klasy przejścia, sposób skonfigurowania tej instancji będzie inny, ponieważ nasz przycisk PPP znajduje się w regionie MainActivity, a element ComposeFragment znajduje się wewnątrz kontenera hosta nawigacji MainActivity.

W narzędziu ComposeFragment.kt dodaj poniższy fragment kodu do metody onViewCreated, pamiętając, aby zaimportować wersję androidx.transition metody Slide.

ComposeFragment.kt

enterTransition = MaterialContainerTransform().apply {
   startView = requireActivity().findViewById(R.id.fab)
   endView = emailCardView
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   scrimColor = Color.TRANSPARENT
   containerColor = requireContext().themeColor(R.attr.colorSurface)
   startContainerColor = requireContext().themeColor(R.attr.colorSecondary)
   endContainerColor = requireContext().themeColor(R.attr.colorSurface)
}
returnTransition = Slide().apply {
   duration = resources.getInteger(R.integer.reply_motion_duration_medium).toLong()
   addTarget(R.id.email_card_view)
}

Oprócz parametrów używanych do konfigurowania poprzedniego przekształcenia kontenera parametry startView i endView ustawiane są tu ręcznie. Zamiast używać atrybutów transitionName, które informują system Android Migrate, które widoki należy przekształcić, możesz w razie potrzeby określić je ręcznie.

Teraz uruchom aplikację ponownie. Przycisk PPP powinien pojawić się na ekranie tworzenia (zobacz GIF na końcu tego kroku).

Podobnie jak w poprzednim kroku, musisz dodać przejście do elementu HomeFragment, aby nie znikało po usunięciu i zastąpieniu elementem ComposeFragment.

Skopiuj poniższy fragment kodu do metody navigateToCompose w MainActivity przed wywołaniem NavController navigate.

MainActivity.kt

currentNavigationFragment?.apply {
   exitTransition = MaterialElevationScale(false).apply {
       duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   }
   reenterTransition = MaterialElevationScale(true).apply {
       duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   }
}

To wszystko na dziś. Powinno nastąpić przejście z przycisku PPP do ekranu tworzenia wiadomości, który będzie podobny do tego:

81b68391ac4b0a9.gif

6. Dodaj przejście z ikony wyszukiwania na stronę widoku wyszukiwania na wspólnej osi Z

W tym kroku dodamy przejście z ikony wyszukiwania do widoku wyszukiwania na pełnym ekranie. Ponieważ zmiana nawigacji nie wymaga trwałego kontenera, możemy użyć przejścia we wspólnej osi Z, aby wzmocnić relację przestrzenną między dwoma ekranami i wskazać przesunięcie o jeden poziom wyżej w hierarchii aplikacji.

Zanim dodasz kolejny kod, uruchom aplikację i kliknij ikonę wyszukiwania w prawym dolnym rogu ekranu. Powinno to spowodować wyświetlenie ekranu wyszukiwania bez żadnego przejścia.

499e1a677b4216bb.gif

Aby rozpocząć, znajdź metodę navigateToSearch w narzędziu MainActivity i dodaj ten fragment kodu przed wywołaniem metody NavController navigate, aby skonfigurować wyjście bieżącego fragmentu i ponownie wprowadzić MaterialSharedAxis przejścia na osi Z.

MainActivity.kt

currentNavigationFragment?.apply {
   exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).apply {
       duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   }
   reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false).apply {
       duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   }
}

Następnie dodaj poniższy fragment kodu do metody onCreate w SearchFragment, która konfiguruje przejścia typu „Enter” i „MaterialSharedAxis”.

SearchFragment.kt

enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).apply {
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
}
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false).apply {
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
}

Aby przejście MaterialSharedAxis zostało zastosowane do całego ekranu wyszukiwania, a nie do poszczególnych widoków w hierarchii, oznacz LinearLayout w elemencie fragment_search.xml jako grupę przejścia.

fragment_search.xml

android:transitionGroup="true"

Znakomicie. Teraz uruchom aplikację jeszcze raz i dotknij ikony wyszukiwania. Ekrany głównego i widoku wyszukiwania powinny jednocześnie zanikać i skalować dokładnie wzdłuż osi Z, tworząc płynny efekt między obydwoma ekranami.

e5c0b0a130e807db.gif

7. Dodawanie przejścia między stronami skrzynki pocztowej

W tym kroku dodamy przejście między różnymi skrzynkami pocztowymi. Ponieważ nie chcemy podkreślać relacji przestrzennej ani hierarchicznej, do przeprowadzenia prostej „zmiany” użyjemy zanikania. między listami adresów e-mail.

Zanim dodasz kolejny kod, uruchom aplikację, dotknij logo Odpowiedz na dolnym pasku aplikacji i zmień skrzynki pocztowe. Lista adresów e-mail powinna się zmienić bez konieczności przenoszenia.

2c874c0a4588e8fb.gif

Na początek znajdź metodę navigateToHome w narzędziu MainActivity i dodaj ten fragment kodu przed wywołaniem metody NavController navigate w celu skonfigurowania przejścia MaterialFadeThrough bieżącego fragmentu.

MainActivity.kt

currentNavigationFragment?.apply {
   exitTransition = MaterialFadeThrough().apply {
       duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
   }
}

Następnie otwórz HomeFragment. W narzędziu onCreate ustaw dla parametru enterTransition fragmentu nowe wystąpienie MaterialFadeThrough.

HomeFragment.kt

enterTransition = MaterialFadeThrough().apply {
   duration = resources.getInteger(R.integer.reply_motion_duration_large).toLong()
}

Uruchom aplikację ponownie. Po otwarciu dolnego panelu nawigacji i zmianie skrzynek pocztowych bieżąca lista e-maili powinna zanikać i skalować w poziomie, a nowa lista zanika i skaluje się. Super!

f61dfd58ea7bd3fd.gif

8. Dodaj przejście z elementu z adresem e-mail na widok karty w ramach przekształcenia kontenera

W tym kroku dodasz przejście, które przekształci element w wyskakującą kartę. Używane jest tu przekształcenie kontenera, aby poinformować użytkownika, że działanie wykonane w wyskakującym okienku wpłynie na element, z którego pochodzi ono.

Zanim dodasz kod, uruchom aplikację Reply, kliknij e-maila i kliknij „Odpowiedz”. kliknij przycisk typu FAB, a potem kliknij element kontaktu odbiorcy. Element powinien od razu zniknąć, a karta z adresami e-mail kontaktu powinna pojawić się bez animacji.

6200c682da2382d5.gif

W tym kroku będziesz pracować w domenie ComposeFragment. Do układu ComposeFragment dodano już elementy odbiorcy (domyślnie widoczne) oraz kartę odbiorcy (domyślnie niewidoczną). Element odbiorcy i ta karta to 2 widoki, między którymi utworzysz przekształcenie kontenera.

Aby rozpocząć, otwórz ComposeFragment i znajdź metodę expandChip. Ta metoda jest wywoływana po kliknięciu podanego chip. Dodaj ten fragment kodu nad wierszami, które zamienią widoczność recipientCardView i chip. Spowoduje to uruchomienie przekształcenia kontenera zarejestrowanego przez beginDelayedTransition.

ComposeFragment.kt

val transform = MaterialContainerTransform().apply {
   startView = chip
   endView = binding.recipientCardView
   scrimColor = Color.TRANSPARENT
   endElevation = requireContext().resources.getDimension(
       R.dimen.email_recipient_card_popup_elevation_compat
   )
   addTarget(binding.recipientCardView)
}

TransitionManager.beginDelayedTransition(binding.composeConstraintLayout, transform)

Jeśli uruchomisz aplikację teraz, element powinien przekształcić się w kartę z adresami e-mail odbiorcy. Teraz skonfigurujemy przejście powrotne, aby zwinąć kartę z powrotem do elementu.

W metodzie collapseChip w ComposeFragment dodaj poniższy fragment kodu, aby zwinąć kartę z powrotem do elementu.

ComposeFragment.kt

val transform = MaterialContainerTransform().apply {
   startView = binding.recipientCardView
   endView = chip
   scrimColor = Color.TRANSPARENT
   startElevation = requireContext().resources.getDimension(
       R.dimen.email_recipient_card_popup_elevation_compat
   )
   addTarget(chip)
}

TransitionManager.beginDelayedTransition(binding.composeConstraintLayout, transform)

Uruchom aplikację ponownie. Kliknięcie elementu powinno rozwinąć element na kartę, a kliknięcie karty spowoduje zwinięcie karty z powrotem do elementu. Super!

e823b28e2890e05d.gif

9. Wszystko gotowe

Biblioteka MDC-Android, wykorzystująca mniej niż 100 wierszy kodu Kotlin i kilka podstawowych znaczników XML, pomogła stworzyć piękną przejścia w dotychczasowej aplikacji, która jest zgodna z wytycznymi Material Design, a także wygląda i działa spójnie na wszystkich urządzeniach z Androidem.

454a47ba96017a25.gif

Dalsze kroki

Aby dowiedzieć się więcej o systemie Material Motion, zapoznaj się ze specyfikacją i pełną dokumentacją dla programistów oraz spróbuj dodać do swojej aplikacji przejścia w stylu Material.

Dziękujemy za wypróbowanie ruchu Material Design. Mamy nadzieję, że to ćwiczenie z programowania Ci się podobało.

Udało mi się ukończyć to ćwiczenia z programowania w rozsądny sposób i w rozsądny sposób

Całkowicie się zgadzam Zgadzam się Nie mam zdania Nie zgadzam się Całkowicie się nie zgadzam

Chcę w przyszłości nadal korzystać z systemu ruchu Material

Całkowicie się zgadzam Zgadzam się Nie mam zdania Nie zgadzam się Całkowicie się nie zgadzam
.