Puoi creare animazioni e transizioni personalizzate delle proprietà in-app, animazioni personalizzate tra attività e animazioni personalizzate tra frammenti con gesti Indietro predittivi utilizzando Views o Compose. Per provare il metodo Compose, consulta Aggiungi il supporto delle animazioni per la funzionalità Indietro predittivo.
Aggiungi transizioni personalizzate utilizzando l'API Progress
Con AndroidX Activity 1.8.0-alpha01 o versioni successive, puoi utilizzare le API Predictive Back Progress per sviluppare animazioni personalizzate per il gesto Indietro predittivo nella tua app. Le API Progress sono utili per animare le visualizzazioni, ma presentano limitazioni quando si animano le transizioni tra i frammenti. All'interno di OnBackPressedCallback
abbiamo introdotto i metodi handleOnBackProgressed, handleOnBackCancelled
e handleOnBackStarted per animare gli oggetti mentre l'utente scorre
indietro. Utilizza questi metodi se devi personalizzare più delle animazioni predefinite fornite dal sistema o delle animazioni dei componenti Material.
Prevediamo che la maggior parte delle app utilizzerà le API AndroidX compatibili con le versioni precedenti, ma esistono anche API della piattaforma simili nell'interfaccia OnBackAnimationCallback disponibili per i test in Android 14 e versioni successive.
Utilizza le API Progress con le transizioni AndroidX
Le API Progress possono essere utilizzate con AndroidX Transitions 1.5.0-alpha01 o versioni successive su Android 14 e versioni successive per creare transizioni Indietro predittivo.
- Utilizza
TransitionManager#controlDelayedTransitionanzichébeginDelayedTransitionper riprodurre le transizioni quando l'utente scorre indietro. - Crea la transizione all'interno di
handleOnBackStarted. - Riproduci la transizione con l'evento Indietro all'interno di
handleOnBackProgressedmettendo in relazionecurrentFractionconBackEvent.progress, che mostra quanto l'utente ha fatto scorrere indietro. - Termina la transizione dopo che l'utente ha eseguito il gesto "Indietro" in
handleOnBackPressed. - Infine, reimposta lo stato della transizione all'interno di
handleOnBackCancelled.
Il seguente video, il codice Kotlin e l'XML mostrano una transizione personalizzata tra due riquadri implementati con 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>
Quando utilizzi le transizioni Indietro predittivo, tieni presente quanto segue:
- Utilizza
isSeekingSupportedper verificare se la transizione supporta il gesto Indietro predittivo. - Esegui l'override di
isSeekingSupportedper restituire true per le transizioni personalizzate. - Crea un controller per animazione.
- Le transizioni di Indietro predittivo sono supportate con le transizioni AndroidX,
ma non con le transizioni del framework. Esegui la migrazione dalle transizioni del framework e utilizza invece le transizioni
Animatore AndroidX. - Le transizioni Indietro predittivo sono supportate sui dispositivi con Android 14 e versioni successive e non sono compatibili con le versioni precedenti.
- Sono supportate anche le transizioni create con scene XML. In
handleOnBackStarted, impostaTransitionSeekControllersul risultato diTransitionManager.createSeekControlleranziché sul risultato dicontrolDelayedTransition.
Risorse aggiuntive
- Esempi di codice per Indietro predittivo
- Nozioni di base sul video del pulsante Indietro del sistema
- Costruire il futuro dei video su Android