Mit Ansichten oder Compose kannst du benutzerdefinierte In-App-Attributanimationen und ‑übergänge, benutzerdefinierte aktivitätsübergreifende Animationen und benutzerdefinierte fragmentübergreifende Animationen mit intelligenten „Zurück“-Touchgesten erstellen. Wenn Sie die Compose-Methode ausprobieren möchten, lesen Sie den Hilfeartikel Unterstützung für intelligente „Zurück“-Geste-Animationen hinzufügen.
Benutzerdefinierte Übergänge mit der Progress API hinzufügen
Mit AndroidX Activity 1.8.0-alpha01 oder höher können Sie die Progress APIs für die intelligente „Zurück“-Geste verwenden, um benutzerdefinierte Animationen für die intelligente „Zurück“-Geste in Ihrer App zu entwickeln. Progress APIs sind hilfreich, um Ansichten zu animieren, haben aber Einschränkungen beim Animieren von Übergängen zwischen Fragmenten. In OnBackPressedCallback haben wir die Methoden handleOnBackProgressed, handleOnBackCancelled und handleOnBackStarted eingeführt, um Objekte zu animieren, während der Nutzer zurückwischt. Verwenden Sie diese Methoden, wenn Sie mehr als die vom System bereitgestellten Standardanimationen oder die Animationen der Material-Komponenten anpassen möchten.
Wir gehen davon aus, dass die meisten Apps die abwärtskompatiblen AndroidX APIs verwenden. Es gibt aber auch ähnliche Plattform-APIs in der Schnittstelle OnBackAnimationCallback, die unter Android 14 und höher getestet werden können.
Progress APIs mit AndroidX-Übergängen verwenden
Die Progress APIs können mit AndroidX Transitions 1.5.0-alpha01 oder höher unter Android 14 und höher verwendet werden, um Übergänge für die intelligente „Zurück“-Geste zu erstellen.
- Verwende
TransitionManager#controlDelayedTransitionanstelle vonbeginDelayedTransition, um Übergänge abzuspielen, wenn der Nutzer zurückwischt. - Erstellen Sie den Übergang in
handleOnBackStarted. - Spiele den Übergang mit dem Zurück-Ereignis in
handleOnBackProgressedab, indem ducurrentFractionmitBackEvent.progressverknüpfst. Dadurch wird angezeigt, wie weit der Nutzer zurückgewischt hat. - Schließe den Übergang ab, nachdem der Nutzer die Geste „Zurück“ in
handleOnBackPressedausgeführt hat. - Setzen Sie schließlich den Status des Übergangs in
handleOnBackCancelledzurück.
Das folgende Video, der Kotlin-Code und die XML-Datei zeigen einen benutzerdefinierten Übergang zwischen zwei Boxen, der mit OnBackPressedCallback implementiert wurde:
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>
Beachte bei der Arbeit mit Übergängen für die intelligente „Zurück“-Geste Folgendes:
- Mit
isSeekingSupportedkannst du prüfen, ob der Übergang die intelligente „Zurück“-Geste unterstützt. - Überschreibe
isSeekingSupported, damit für deine benutzerdefinierten Übergänge „true“ zurückgegeben wird. - Erstellen Sie einen Controller pro Animation.
- Übergänge für die intelligente „Zurück“-Geste werden mit AndroidX-Übergängen unterstützt, aber nicht mit Framework-Übergängen. Migrieren Sie von Framework-Übergängen und verwenden Sie stattdessen
Animator- und AndroidX-Übergänge. - Übergänge mit der intelligenten „Zurück“-Geste werden auf Geräten mit Android 14 und höher unterstützt und sind nicht abwärtskompatibel.
- Mit XML-Szenen erstellte Übergänge werden ebenfalls unterstützt. Legen Sie in
handleOnBackStartedfürTransitionSeekControllerdas Ergebnis vonTransitionManager.createSeekControlleranstelle des Ergebnisses voncontrolDelayedTransitionfest.
Zusätzliche Ressourcen
- Codebeispiele für die intelligente „Zurück“-Geste
- Grundlagen für das Video zur Systemrückgabe
- Die Zukunft von Android-Videos gestalten