Avviare un'attività utilizzando un'animazione

Prova Compose
Jetpack Compose è il toolkit per la UI consigliato per Android. Scopri come lavorare con le animazioni in Crea.

Le transizioni di attività nelle app Material Design forniscono connessioni visive tra diversi stati tramite movimento e trasformazioni tra elementi comuni. Puoi specificare animazioni personalizzate per le transizioni di entrata e uscita e per le transizioni degli elementi condivisi tra le attività.

Figura 1. Una transizione con elementi condivisi.

  • Una transizione enter determina il modo in cui le visualizzazioni in un'attività entrano in scena. Ad esempio, nella transizione di explodeentrata, le visualizzazioni entrano nella scena dall'esterno e volano verso l'interno fino al centro dello schermo.
  • Una transizione di uscita determina il modo in cui le visualizzazioni in un'attività escono dalla scena. Ad esempio, nella transizione di uscita explode, le visualizzazioni escono dalla scena allontanandosi dal centro.
  • Una transizione elementi condivisi determina il modo in cui le visualizzazioni condivise tra due attività passano da un'attività all'altra. Ad esempio, se due attività hanno la stessa immagine in posizioni e dimensioni diverse, la transizione dell'elemento condiviso changeImageTransform sposta e ridimensiona l'immagine in modo uniforme tra queste attività.

Android supporta le seguenti transizioni di entrata e uscita:

  • explode: sposta le visualizzazioni verso l'interno o l'esterno del centro della scena.
  • slide: sposta le visualizzazioni all'interno o all'esterno di uno dei bordi della scena.
  • fade: aggiunge o rimuove una visualizzazione dalla scena modificandone l'opacità.

Qualsiasi transizione che estende la classe Visibility è supportata come transizione di entrata o uscita. Per saperne di più, consulta il riferimento API per la classe Transition.

Android supporta anche le seguenti transizioni degli elementi condivisi:

  • changeBounds: anima le modifiche ai limiti del layout delle visualizzazioni di destinazione.
  • changeClipBounds: anima le modifiche ai limiti del clip delle visualizzazioni di destinazione.
  • changeTransform: anima le modifiche alla scala e alla rotazione delle visualizzazioni di destinazione.
  • changeImageTransform: anima le modifiche alle dimensioni e alla scala delle immagini di destinazione.

Quando attivi le transizioni di attività nella tua app, la transizione di dissolvenza incrociata predefinita si attiva tra le attività di entrata e uscita.

Figura 2. Una transizione di scena con un elemento condiviso.

Per un codice campione che anima le transizioni tra attività utilizzando elementi condivisi, vedi ActivitySceneTransitionBasic.

Controllare la versione del sistema

Le API Activity Transition sono disponibili su Android 5.0 (API 21) e versioni successive. Per preservare la compatibilità con le versioni precedenti di Android, controlla version del sistema in fase di runtime prima di richiamare le API per una di queste funzionalità:

Kotlin

// Check if we're running on Android 5.0 or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Apply activity transition
} else {
    // Swap without transition
}

Java

// Check if we're running on Android 5.0 or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Apply activity transition
} else {
    // Swap without transition
}

Specificare transizioni personalizzate

Innanzitutto, attiva le transizioni dei contenuti delle finestre con l'attributo android:windowActivityTransitions quando definisci uno stile che eredita dal tema Material. Puoi anche specificare le transizioni di entrata, uscita e degli elementi condivisi nella definizione dello stile:

<style name="BaseAppTheme" parent="android:Theme.Material">
  <!-- enable window content transitions -->
  <item name="android:windowActivityTransitions">true</item>

  <!-- specify enter and exit transitions -->
  <item name="android:windowEnterTransition">@transition/explode</item>
  <item name="android:windowExitTransition">@transition/explode</item>

  <!-- specify shared element transitions -->
  <item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
  <item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>
</style>

La transizione change_image_transform in questo esempio è definita come segue:

<!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
  <changeImageTransform/>
</transitionSet>

L'elemento changeImageTransform corrisponde alla classe ChangeImageTransform. Per saperne di più, consulta il riferimento API per Transition.

Per attivare le transizioni dei contenuti della finestra nel codice, chiama la funzione Window.requestFeature():

Kotlin

// Inside your activity (if you did not enable transitions in your theme)
with(window) {
    requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS)

    // Set an exit transition
    exitTransition = Explode()
}

Java

// Inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);

// Set an exit transition
getWindow().setExitTransition(new Explode());

Per specificare le transizioni nel codice, chiama queste funzioni con un oggetto Transition:

Le funzioni setExitTransition() e setSharedElementExitTransition() definiscono la transizione di uscita per l'attività chiamante. Le funzioni setEnterTransition() e setSharedElementEnterTransition() definiscono la transizione di entrata per l'attività chiamata.

Per ottenere l'effetto completo di una transizione, devi attivare le transizioni dei contenuti delle finestre sia nell'attività chiamante che in quella chiamata. In caso contrario, l'attività di chiamata avvia la transizione di uscita, ma poi vedi le transizioni della finestra, come la scalatura o la dissolvenza.

Per avviare una transizione di ingresso il prima possibile, utilizza la funzione Window.setAllowEnterTransitionOverlap() nell'attività chiamata. In questo modo, le transizioni di entrata sono più spettacolari.

Avviare un'attività utilizzando le transizioni

Se attivi le transizioni e imposti una transizione di uscita per un'attività, la transizione si attiva quando avvii un'altra attività, come segue:

Kotlin

startActivity(intent,
              ActivityOptions.makeSceneTransitionAnimation(this).toBundle())

Java

startActivity(intent,
              ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

Se imposti una transizione di ingresso per la seconda attività, questa si attiva anche all'inizio dell'attività. Per disattivare le transizioni quando inizi un'altra attività, fornisci un bundle di opzioni null.

Avviare un'attività con un elemento condiviso

Per creare un'animazione di transizione dello schermo tra due attività che hanno un elemento condiviso:

  1. Attiva le transizioni dei contenuti delle finestre nel tema.
  2. Specifica una transizione degli elementi condivisi nello stile.
  3. Definisci la transizione come risorsa XML.
  4. Assegna un nome comune agli elementi condivisi in entrambi i layout con l'attributo android:transitionName.
  5. Utilizza la funzione ActivityOptions.makeSceneTransitionAnimation().

Kotlin

// Get the element that receives the click event
val imgContainerView = findViewById<View>(R.id.img_container)

// Get the common element for the transition in this activity
val androidRobotView = findViewById<View>(R.id.image_small)

// Define a click listener
imgContainerView.setOnClickListener( {
    val intent = Intent(this, Activity2::class.java)
    // Create the transition animation - the images in the layouts
    // of both activities are defined with android:transitionName="robot"
    val options = ActivityOptions
            .makeSceneTransitionAnimation(this, androidRobotView, "robot")
    // Start the new activity
    startActivity(intent, options.toBundle())
})

Java

// Get the element that receives the click event
final View imgContainerView = findViewById(R.id.img_container);

// Get the common element for the transition in this activity
final View androidRobotView = findViewById(R.id.image_small);

// Define a click listener
imgContainerView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, Activity2.class);
        // Create the transition animation - the images in the layouts
        // of both activities are defined with android:transitionName="robot"
        ActivityOptions options = ActivityOptions
            .makeSceneTransitionAnimation(this, androidRobotView, "robot");
        // Start the new activity
        startActivity(intent, options.toBundle());
    }
});

Per le visualizzazioni dinamiche condivise che generi nel codice, utilizza la funzione View.setTransitionName() per specificare un nome di elemento comune in entrambe le attività.

Per invertire l'animazione di transizione della scena al termine della seconda attività, chiama la funzione Activity.finishAfterTransition() anziché Activity.finish().

Avviare un'attività con più elementi condivisi

Per creare un'animazione di transizione tra due attività che hanno più di un elemento condiviso, definisci gli elementi condivisi in entrambi i layout con l'attributo android:transitionName o utilizza la funzione View.setTransitionName() in entrambe le attività e crea un oggetto ActivityOptions come segue:

Kotlin

// Rename the Pair class from the Android framework to avoid a name clash
import android.util.Pair as UtilPair
...
val options = ActivityOptions.makeSceneTransitionAnimation(this,
        UtilPair.create(view1, "agreedName1"),
        UtilPair.create(view2, "agreedName2"))

Java

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
        Pair.create(view1, "agreedName1"),
        Pair.create(view2, "agreedName2"));