Crea un'animazione di transizione personalizzata

Una transizione personalizzata consente di creare un'animazione che non è disponibile in nessuno di le classi di transizione integrate. Ad esempio, puoi definire una transizione personalizzata che il colore in primo piano del testo e dei campi di immissione in grigio per indicare che i campi sono disattivati. nella nuova schermata. Questo tipo di modifica consente agli utenti di visualizzare i campi che hai disattivato.

Una transizione personalizzata, come uno dei tipi di transizione integrati, applica animazioni a le visualizzazioni figlio di entrambe le scene iniziali e finali. Tuttavia, a differenza dei tipi di transizione integrati, devi fornire il codice che acquisisce i valori delle proprietà e genera le animazioni. Potresti anche voler definire un sottoinsieme di visualizzazioni target per l'animazione.

Questa pagina ti insegna come acquisire i valori delle proprietà e generare animazioni per creare transizioni personalizzate.

Estendi la classe Transizione

Per creare una transizione personalizzata, aggiungi al progetto una classe che estende la classe Transition e sostituisci le funzioni mostrate nel seguente snippet:

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

Le sezioni seguenti spiegano come eseguire l'override di queste funzioni.

Acquisisci i valori delle proprietà di una vista

Le animazioni delle transizioni utilizzano il sistema di animazione delle proprietà descritto in Panoramica dell'animazione della proprietà. Proprietà le animazioni modificano una proprietà di visualizzazione da un valore iniziale a un valore finale rispetto a un valore specificato di tempo, quindi il framework deve avere sia il valore iniziale che quello finale la proprietà per creare l'animazione.

Tuttavia, l'animazione di una proprietà di solito richiede solo un piccolo sottoinsieme di tutte le proprietà della vista e i relativi valori. Ad esempio, un'animazione a colori richiede valori di proprietà colore, mentre un movimento l'animazione richiede i valori delle proprietà di posizione. Poiché i valori della proprietà necessari per un'animazione sono specifiche di una transizione, il framework delle transizioni non fornisce il valore di tutte le proprietà a una transizione. Il framework richiama invece le funzioni di callback che consentono una transizione acquisire solo i valori delle proprietà di cui ha bisogno e archiviarli nel framework.

Acquisisci valori iniziali

Per passare i valori della vista iniziale al framework, implementa la classe captureStartValues(transitionValues) personalizzata. Il framework chiama questa funzione per ogni vista nella scena iniziale. La funzione è un oggetto TransitionValues che contiene un riferimento alla vista e a un'istanza Map in cui puoi archiviare i valori della vista desiderato. Nell'implementazione, recupera questi valori delle proprietà e ritrasmettili alla archiviandoli nella mappa.

Per garantire che la chiave per il valore di una proprietà non sia in conflitto con altri TransitionValues chiavi, usa il seguente schema di denominazione:

package_name:transition_name:property_name

Il seguente snippet mostra un'implementazione della funzione captureStartValues():

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

Acquisisci i valori finali

Il framework chiama la funzione captureEndValues(TransitionValues) una volta per ogni vista target nella scena finale. In tutti gli altri aspetti, captureEndValues() funziona come captureStartValues().

Il seguente snippet di codice mostra un'implementazione della funzione captureEndValues():

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

In questo esempio, captureStartValues() e captureEndValues() richiamano captureValues() per recuperare e archiviare i valori. La proprietà vista recuperato da captureValues() è lo stesso, ma ha valori diversi nelle iniziare e terminare le scene. Il framework mantiene mappe separate per l'inizio e la fine gli stati di una vista.

Crea un animatore personalizzato

Per animare le modifiche a una vista tra il suo stato nella scena iniziale e il suo stato in la scena finale, utilizza un animatore sostituendo createAnimator() personalizzata. Quando il framework chiama questa funzione, passa alla vista radice della scena e TransitionValues oggetti contenenti i valori iniziali e finali che hai acquisito.

Il numero di volte in cui il framework chiama la funzione createAnimator() dipende dalla cambiamenti che avvengono tra la scena iniziale e quella finale.

Ad esempio, considera una dissolvenza in uscita o animazione di dissolvenza in entrata implementata come transizione personalizzata. Se la scena iniziale ha cinque target, che due vengono rimossi dalla scena finale, mentre la scena finale contiene i tre target scena iniziale più un nuovo target, il framework chiama createAnimator() sei volte. Tre chiamate animano le dissolvenze in uscita e in entrata dei target che rimangono in entrambe le scene di oggetti strutturati. Altre due chiamate animano la dissolvenza dei target rimossi dalla scena finale. Uno. anima la dissolvenza in entrata del nuovo target nella scena finale.

Per le viste target presenti sia nella scena iniziale che in quella finale, il framework fornisce un oggetto TransitionValues sia per startValues che per endValues argomenti. Per le viste target che esistono solo nella fase iniziale scena finale, il framework fornisce un oggetto TransitionValues per l'argomento corrispondente e null per l'altro.

Per implementare la funzione createAnimator(ViewGroup, TransitionValues, TransitionValues) quando crei una transizione personalizzata, utilizza i valori delle proprietà view che hai acquisito per creare un oggetto Animator e restituirlo al framework. Per un'implementazione di esempio, vedi il corso ChangeColor in Esempio di CustomTransizione. Per saperne di più sugli animatori delle proprietà, consulta Animazione proprietà.

Applicare una transizione personalizzata

Le transizioni personalizzate funzionano come le transizioni integrate. Puoi applicare una transizione personalizzata utilizzando un gestore delle transizioni, come descritto in Applicare una transizione.