Vue d'ensemble des animations personnalisées

Mise à jour : novembre 2007

Cette rubrique décrit comment et quand étendre le système d'animation WPF en créant des images clés personnalisées, des classes d'animation ou en utilisant un rappel image par image pour l'ignorer.

Composants requis

Pour comprendre cette rubrique, vous devez être familiarisé avec les différents types d'animations fournis par WPF. Pour plus d'informations, consultez Vue d'ensemble des animations From/To/By, Vue d'ensemble des animations d'image clé et Vue d'ensemble des animations de tracés.

Étant donné que les classes d'animation héritent de la classe Freezable, vous devez être familiarisé avec les objets Freezable et savoir comment hériter du Freezable. Pour plus d'informations, consultez Vue d'ensemble des objets Freezable.

Amélioration du système d'animation

Il existe plusieurs façons d'étendre le système d'animation WPF, en fonction du niveau de fonctionnalités intégrées que vous souhaitez utiliser. Le moteur d'animation WPF comporte trois points d'extensibilité principaux :

  • Créer un objet d'image clé personnalisée à partir d'un héritage d'une des classes *<Type>*KeyFrame, telles que DoubleKeyFrame. Cette approche utilise la plupart des fonctionnalités intégrées du moteur d'animation WPF.

  • Créer votre propre classe d'animation à partir d'un héritage d'un AnimationTimeline ou d'une des classes *<Type>*AnimationBase.

  • Utiliser un rappel image par image pour générer des animations par image. Cette approche ignore entièrement le système de minutage et d'animation.

Le tableau suivant décrit certains des scénarios permettant d'étendre le système d'animation.

Si vous souhaitez…

Utilisez cette approche

Personnaliser l'interpolation entre les valeurs d'un type qui possède un <Type>AnimationUsingKeyFrames correspondant

Créer une image clé personnalisée. Pour plus d'informations, consultez Créer une image clé personnalisée.

Personnaliser plus que l'interpolation entre les valeurs d'un type qui possède un <Type>Animation correspondant.

Créer une classe d'animation personnalisée qui hérite de la classe <Type>AnimationBase correspondant au type à animer. Pour plus d'informations, consultez Créer une classe d'animation personnalisée.

Animer un type qui n'a pas d'animation WPF correspondante

Utiliser un ObjectAnimationUsingKeyFrames ou créer une classe qui hérite de AnimationTimeline. Pour plus d'informations, consultez Créer une classe d'animation personnalisée.

Animer plusieurs objets avec des valeurs calculées à chaque trame et basées sur le dernier jeu d'interactions d'objets

Utiliser le rappel image par image. Pour plus d'informations, consultez Utiliser un rappel image par image.

Créer une image clé personnalisée

La façon la plus simple d'étendre le système d'animation consiste à créer une classe d'image clé personnalisée. Utilisez cette approche si vous souhaitez appliquer une autre méthode d'interpolation à une animation par trame. Comme décrit dans Vue d'ensemble des animations d'image clé, une animation d'image clé utilise des objets d'images clés pour générer ses valeurs de sortie. Chaque objet d'image clé exécute les fonctions suivantes :

  • Spécifie une valeur cible à l'aide de sa propriété Value.

  • Spécifie l'heure à laquelle la valeur doit être atteinte à l'aide de sa propriété KeyTime.

  • Interpole entre la valeur de l'image clé précédente et sa propre valeur en implémentant la méthode InterpolateValueCore.

Instructions d'implémentation

Dérivez de la classe abstraite *<Type>*KeyFrame et implémentez la méthode InterpolateValueCore. La méthode InterpolateValueCore retourne la valeur actuelle de l'image clé. Elle utilise deux paramètres : la valeur de l'image clé précédente et une valeur de progression comprise entre 0 et 1. Une valeur de progression 0 indique que l'image clé vient de commencer, et 1 indique que l'image clé est terminée et doit retourner la valeur spécifiée par sa propriété Value.

Étant donné que les classes *<Type>*KeyFrame héritent de la classe Freezable, vous devez substituer CreateInstanceCore pour retourner une nouvelle instance de votre classe. Si la classe n'utilise pas de propriétés de dépendance pour stocker ses données ou si elle nécessite une initialisation supplémentaire une fois créée, vous devrez peut-être remplacer d'autres méthodes. Consultez Vue d'ensemble des objets Freezable pour plus d'informations.

Après avoir créé votre propre animation *<Type>*KeyFrame, vous pouvez l'utiliser avec le *<Type>*AnimationUsingKeyFrames pour ce type.

Créer une classe d'animation personnalisée

En créant votre propre type d'animation, vous disposez de davantage de contrôle sur l'animation d'un objet. Il est recommandé d'utiliser les deux méthodes suivantes pour créer votre propre type d'animation : vous pouvez dériver de la classe AnimationTimeline ou de la classe *<Type>*AnimationBase. La dérivation des classes *<Type>*Animation et *<Type>*AnimationUsingKeyFrames est déconseillée.

Dériver de <Type>AnimationBase

La dérivation de la classe *<Type>*AnimationBase est le moyen le plus simple pour créer un nouveau type d'animation. Utilisez cette approche si vous souhaitez créer une animation pour un type qui a déjà une classe *<Type>*AnimationBase correspondante.

Instructions d'implémentation

Dérivez d'une classe *<Type>*Animation et implémentez la méthode GetCurrentValueCore. La méthodeGetCurrentValueCore retourne la valeur actuelle de l'animation. Elle utilise trois paramètres : une valeur de début suggérée, une valeur de fin suggérée et un AnimationClock, que vous utilisez pour déterminer la progression de l'animation.

Étant donné que les classes *<Type>*AnimationBase héritent de la classe Freezable, vous devez substituer CreateInstanceCore pour retourner une nouvelle instance de votre classe. Si la classe n'utilise pas de propriétés de dépendance pour stocker ses données ou si elle nécessite une initialisation supplémentaire une fois créée, vous devrez peut-être remplacer d'autres méthodes. Consultez Vue d'ensemble des objets Freezable pour plus d'informations.

Pour plus d'informations, consultez la documentation sur la méthode GetCurrentValueCore pour la classe *<Type>*AnimationBase du type à animer. Pour obtenir un exemple, consultez Animation personnalisée, exemple.

Autres approches

Si vous souhaitez simplement modifier la façon dont les valeurs d'animation sont interpolées, envisagez de dériver une des classes *<Type>*KeyFrame. L'image clé créée peut être utilisée avec le *<Type>*AnimationUsingKeyFrames correspondant fourni par WPF.

Dériver de AnimationTimeline

Dérivez de la classe AnimationTimeline si vous souhaitez créer une animation pour un type qui ne dispose pas encore d'une animation WPF correspondante, ou si vous souhaitez créer une animation qui n'est pas fortement typée.

Instructions d'implémentation

Dérivez de la classe AnimationTimeline et substituez les membres suivants :

  • CreateInstanceCore : si votre nouvelle classe est concrète, vous devez remplacer CreateInstanceCore pour obtenir une nouvelle instance de votre classe.

  • GetCurrentValue : remplacez cette méthode pour obtenir la valeur actuelle de votre animation. Trois paramètres sont nécessaires : valeur d'origine par défaut, valeur de destination par défaut et AnimationClock. Utilisez AnimationClock pour obtenir le décompte actuel ou l'état d'avancement de l'animation. Vous pouvez choisir d'utiliser les valeurs d'origine et les valeurs de destination par défaut.

  • IsDestinationDefault : remplacez cette propriété pour indiquer si votre animation doit utiliser les valeurs de destination par défaut spécifiées par la méthode GetCurrentValue.

  • TargetPropertyType : remplacez cette propriété pour indiquer le type Type de sortie que votre animation doit générer.

Si la classe n'utilise pas de propriétés de dépendance pour stocker ses données ou si elle nécessite une initialisation supplémentaire une fois créée, vous devrez peut-être remplacer d'autres méthodes. Consultez Vue d'ensemble des objets Freezable pour plus d'informations.

Le paradigme recommandé (utilisé par les animations WPF) consiste à utiliser deux niveaux d'héritage :

  1. Créez une classe abstraite *<Type>*AnimationBase qui dérive de AnimationTimeline. Cette classe se substitue à la méthode TargetPropertyType. Elle doit aussi introduire une nouvelle méthode abstraite, GetCurrentValueCore, et se substituer à GetCurrentValue afin de valider les types des paramètres des valeurs d'origine par défaut et des valeurs de destination par défaut, et appeler GetCurrentValueCore.

  2. Créez une autre classe qui hérite de votre nouvelle classe *<Type>*AnimationBase et se substitue à la méthode CreateInstanceCore, la méthode GetCurrentValueCore introduite, et à la propriété IsDestinationDefault.

Autres approches

Si vous souhaitez animer un type qui n'a pas d'animation From/To/By ou d'animation d'image clé, envisagez d'utiliser un ObjectAnimationUsingKeyFrames. Étant donné qu'il est très peu typé, un ObjectAnimationUsingKeyFrames peut animer n'importe quel type de valeur. L'inconvénient de cette approche est que ObjectAnimationUsingKeyFrames prend uniquement en charge une interpolation discrète.

Utiliser un rappel image par image

Utilisez cette approche si vous devez ignorer entièrement le système d'animation WPF. Cette approche est utilisée pour les scénarios d'animations physiques dans lesquels à chaque étape de l'animation une nouvelle direction ou position des objets animés doit être recalculée en fonction du dernier jeu d'interactions d'objets.

Instructions d'implémentation

Contrairement aux autres approches décrites dans cette vue d'ensemble, pour utiliser un rappel image par image il n'est pas nécessaire de créer une animation personnalisée ou une classe d'image clé.

À la place, vous vous inscrivez à l'événement Rendering de l'objet qui contient les objets à animer. Cette méthode du gestionnaire d'événements est appelée une fois par trame. À chaque fois que WPF marshale les données de rendu persistantes dans l'arborescence visuelle sur l'arborescence de composition, la méthode du gestionnaire d'événements est appelée.

Dans le gestionnaire d'événements, effectuez les calculs nécessaires à l'effet de votre animation et définissez les propriétés des objets à animer avec ces valeurs.

Pour obtenir l'heure de la présentation de l'image actuelle, le EventArgs associé à cet événement peut être casté en RenderingEventArgs, qui fournit une propriété RenderingTime pouvant être utilisée pour obtenir l'heure de rendu de l'image actuelle.

Pour plus d'informations, consultez la page Rendering. Pour obtenir un exemple, consultez Animation image par image, exemple.

Voir aussi

Tâches

Animation personnalisée, exemple

Animation image par image, exemple

Concepts

Vue d'ensemble des techniques d'animation de propriétés

Vue d'ensemble des objets Freezable

Vue d'ensemble des animations From/To/By

Vue d'ensemble des animations d'image clé

Vue d'ensemble des animations de tracés

Vue d'ensemble de l'animation

Vue d'ensemble de l'animation et du système de minutage

Référence

AnimationTimeline

IKeyFrame