Créer une animation de transition personnalisée

Une transition personnalisée vous permet de créer une animation qui n'est disponible dans aucun des les classes de transition intégrées. Par exemple, vous pouvez définir une transition personnalisée la couleur de premier plan du texte et des champs de saisie en gris pour indiquer que les champs sont désactivés. sur l'écran qui s'affiche. Ce type de modification permet aux utilisateurs de voir les champs que vous avez désactivés.

Une transition personnalisée, comme l'un des types de transition intégrés, applique des animations à des vues enfants des scènes de début et de fin. Toutefois, contrairement aux types de transition intégrés, vous devez fournir le code permettant de capturer les valeurs des propriétés et de générer des animations. Vous pouvez également définir un sous-ensemble de vues cibles pour votre animation.

Cette page vous explique comment capturer les valeurs des propriétés et générer des animations pour créer des transitions personnalisées.

Étendre la classe Transition

Pour créer une transition personnalisée, ajoutez à votre projet une classe qui étend la classe Transition et remplacez les fonctions présentées dans l'extrait de code suivant:

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) {}
}

Les sections suivantes expliquent comment remplacer ces fonctions.

Capturer les valeurs des propriétés de la vue

Les animations de transition utilisent le système d'animation des propriétés décrit dans la section Présentation de l'animation des propriétés Propriété les animations font passer une propriété de vue d'une valeur de départ à une valeur de fin au cours d'une d'une période donnée. Le framework doit donc avoir les valeurs de début et de fin la propriété pour construire l'animation.

Toutefois, une animation de propriété ne nécessite généralement qu'un petit sous-ensemble des propriétés de la vue. valeurs. Par exemple, une animation couleur nécessite des valeurs de propriétés de couleur, alors qu'un mouvement l'animation nécessite des valeurs de propriété de position. Étant donné que les valeurs de propriété requises pour une animation sont spécifiques à une transition, le framework dédié ne fournit pas toutes les valeurs de propriété à une transition. Au lieu de cela, le framework appelle des fonctions de rappel qui permettent une transition ne capturer que les valeurs de propriété dont il a besoin et les stocker dans le framework.

Capturer les valeurs de départ

Pour transmettre les valeurs de la vue de départ au framework, implémentez la captureStartValues(transitionValues) . Le framework appelle cette fonction pour chaque vue de la scène de départ. La fonction l'argument est un objet TransitionValues qui contient une référence à la vue et une instance Map dans laquelle vous pouvez stocker les valeurs de vue que vous voulez. Dans votre implémentation, récupérez ces valeurs de propriété et transmettez-les à la en les stockant sur la carte.

Pour garantir que la clé d'une valeur de propriété n'entre pas en conflit avec d'autres TransitionValues, utilisez le schéma de nommage suivant:

package_name:transition_name:property_name

L'extrait de code suivant montre une implémentation de la fonction 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());
    }
    ...
}

Capturer les valeurs de fin

Le framework appelle la fonction captureEndValues(TransitionValues) une fois pour chaque vue cible de la scène de fin. À tous les autres égards, captureEndValues() fonctionne de la même manière que captureStartValues().

L'extrait de code suivant illustre une implémentation de la fonction captureEndValues():

Kotlin

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

Java

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

Dans cet exemple, captureStartValues() et captureEndValues() appellent captureValues() pour récupérer et stocker des valeurs. Propriété "view" récupérée par captureValues() est identique, mais a des valeurs différentes dans le les scènes de début et de fin. Le framework gère des cartes distinctes pour le début et la fin d'une vue.

Créer une animation personnalisée

Pour animer les changements de vue entre son état dans la scène de départ et son état dans la scène de fin, fournissez une animation en remplaçant createAnimator() . Lorsque le framework appelle cette fonction, il passe à la vue racine de la scène et Objets TransitionValues contenant les valeurs de début et de fin que vous avez capturées.

Le nombre de fois que le framework appelle la fonction createAnimator() dépend des les modifications qui se produisent entre les scènes de début et de fin.

Prenons l'exemple d'une fermeture en fondu ou Animation de fondu intégrée en tant que transition personnalisée. Si la scène de départ comporte cinq cibles, dont les deux sont retirés de la scène de fin, et que celle-ci comporte les trois cibles scène de départ plus une nouvelle cible, le framework appelle createAnimator() six fois. Trois de ces appels animent le fondu et le fondu des cibles qui se trouvent dans les deux scènes. d'objets. Deux autres appels animent la fermeture en fondu des cibles supprimées de la scène de fin. Un anime le fondu de la nouvelle cible dans la scène de fin.

Pour les vues cibles qui existent à la fois dans les scènes de début et de fin, le framework fournit un objet TransitionValues pour startValues et endValues arguments. Pour les vues cibles qui n'existent que dans le la scène finale, le framework fournit un objet TransitionValues pour l'argument correspondant et null pour l'autre.

Pour implémenter la fonction createAnimator(ViewGroup, TransitionValues, TransitionValues) lorsque vous créez transition personnalisée, utilisez les valeurs de propriété de vue que vous avez capturées pour créer un objet Animator et le renvoyer au framework. Pour obtenir un exemple d'implémentation, consultez la classe ChangeColor dans Exemple CustomTransition. Pour en savoir plus sur les animateurs de propriétés, consultez Animation des propriétés :

Appliquer une transition personnalisée

Les transitions personnalisées fonctionnent de la même manière que les transitions intégrées. Vous pouvez appliquer une transition personnalisée à l'aide d'un gestionnaire de transition, comme décrit dans Appliquer une transition ;