Unterstützung für Animationen für intelligente „Zurück“-Touchgeste in Views hinzufügen

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.

  1. Verwende TransitionManager#controlDelayedTransition anstelle von beginDelayedTransition, um Übergänge abzuspielen, wenn der Nutzer zurückwischt.
  2. Erstellen Sie den Übergang in handleOnBackStarted.
  3. Spiele den Übergang mit dem Zurück-Ereignis in handleOnBackProgressed ab, indem du currentFraction mit BackEvent.progress verknüpfst. Dadurch wird angezeigt, wie weit der Nutzer zurückgewischt hat.
  4. Schließe den Übergang ab, nachdem der Nutzer die Geste „Zurück“ in handleOnBackPressed ausgeführt hat.
  5. Setzen Sie schließlich den Status des Übergangs in handleOnBackCancelled zurü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 isSeekingSupported kannst 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 handleOnBackStarted für TransitionSeekController das Ergebnis von TransitionManager.createSeekController anstelle des Ergebnisses von controlDelayedTransition fest.

Zusätzliche Ressourcen