Vue d'ensemble des animations personnalisées

Cette rubrique explique 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 le rappel par image pour le contourner.

Prérequis

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

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

Extension 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. Il existe trois points d’extensibilité principaux dans le moteur d’animation WPF :

  • Créez un objet de trame de clés personnalisé en hériter de l’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éez votre propre classe d’animation en hériter ou l’une AnimationTimeline des classes *<Type>*AnimationBase.

  • Utilisez le rappel image par image pour générer des animations image par image. Cette approche ignore entièrement l’animation et le système de minutage.

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

Si vous souhaitez... Utiliser cette approche
Personnaliser l’interpolation entre les valeurs d’un type qui a un *<Type>*AnimationUsingKeyFrames correspondant Créez une image clé personnalisée. Pour plus d’informations, consultez la section Création d’une image clé personnalisée.
Personnalisez plus que l’interpolation entre les valeurs d’un type qui a une *<Type>*Animation correspondante. Créez une classe d’animation personnalisée qui hérite de la classe *<Type>*AnimationBase qui correspond au type que vous souhaitez animer. Pour plus d’informations, consultez la section Création d’une classe d’animation personnalisée.
Animer un type qui n’a aucune animation WPF correspondante Utilisez une ObjectAnimationUsingKeyFrames classe ou créez une classe qui hérite de AnimationTimeline. Pour plus d’informations, consultez la section Création d’une classe d’animation personnalisée.
Animer plusieurs objets avec des valeurs calculées à chaque frame et basées sur le dernier jeu d’interactions avec les objets Utilisez un rappel image par image. Pour plus d’informations, consultez la section Création d’un rappel image par image.

Création d’une image clé personnalisée

La création d’une classe d’image clé personnalisée est la façon la plus simple d’étendre le système d’animation. Utilisez cette approche lorsque vous souhaitez une autre méthode d’interpolation pour une animation d’image clé. Comme décrit dans la 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é remplit trois fonctions :

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

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

  • 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 accepte deux paramètres : la valeur de l’image clé précédente et une valeur de progression comprise entre 0 et 1. Une progression de 0 indique que l’image clé vient de démarrer et qu’une valeur de 1 indique que l’image clé vient d’être terminée et doit retourner la valeur spécifiée par sa Value propriété.

Étant donné que les classes *<Type>*KeyFrame héritent de la Freezable classe, vous devez également remplacer CreateInstanceCore le cœur 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 après la création, vous devrez peut-être substituer d’autres méthodes. Consultez Vue d'ensemble des objets Freezable pour plus d’informations.

Une fois que vous avez créé votre animation *<Type>*KeyFrame personnalisée, vous pouvez l’utiliser avec les *<Type>*AnimationUsingKeyFrames pour ce type.

Création d’une classe d’animation personnalisée

La création de votre propre type d’animation vous donne plus de contrôle sur la façon dont objet est animé. Il existe deux façons recommandées de créer votre propre type d’animation : vous pouvez dériver de la AnimationTimeline classe ou de la classe *<Type>*AnimationBase. La dérivation des classes *<Type>*Animation ou *<Type>*AnimationUsingKeyFrames n’est pas recommandée.

Dériver de <Type>AnimationBase

La dérivation d’une classe *<Type>*AnimationBase est le moyen le plus simple de créer un type d’animation. Utilisez cette approche lorsque vous souhaitez créer une animation pour le 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éthode GetCurrentValueCore retourne la valeur actuelle de l’animation. Il prend trois paramètres : une valeur de départ 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 Freezable classe, vous devez également remplacer CreateInstanceCore le cœur 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 après la création, vous devrez peut-être substituer d’autres méthodes. Consultez Vue d'ensemble des objets Freezable pour plus d’informations.

Pour plus d’informations, consultez la documentation de la méthode GetCurrentValueCore pour la classe *<Type>*AnimationBase pour le type que vous souhaitez animer. Pour obtenir un exemple, consultez Exemple d’animation personnalisée

Autres approches

Si vous souhaitez simplement modifier la façon dont les valeurs d’animation sont interpolées, compte tenu de la dérivation de l’une des classes *<Type>*KeyFrame. Le cadre clé que vous créez peut être utilisé avec les *<Type>*AnimationUsingKeyFrames correspondants fournis par WPF.

Dérivation à partir de AnimationTimeline

Dérivez de la AnimationTimeline classe lorsque vous souhaitez créer une animation pour un type qui n’a pas déjà d’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 AnimationTimeline classe et remplacez les membres suivants :

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

  • GetCurrentValue : remplacez cette méthode pour retourner la valeur actuelle de votre animation. Il prend trois paramètres : une valeur d’origine par défaut, une valeur de destination par défaut et un AnimationClock. Utilisez l’option AnimationClock pour obtenir l’heure actuelle ou la progression de l’animation. Vous pouvez choisir d’utiliser les valeurs d’origine et de destination par défaut.

  • IsDestinationDefault : remplacez cette propriété pour indiquer si votre animation utilise la valeur de destination par défaut spécifiée par la GetCurrentValue méthode.

  • TargetPropertyType : remplacez cette propriété pour indiquer la Type sortie produite par votre animation.

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 après la création, vous devrez peut-être substituer 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 *<Type>*AnimationBase abstraite qui dérive de AnimationTimeline. Cette classe doit remplacer la TargetPropertyType méthode. Il doit également introduire une nouvelle méthode abstraite, GetCurrentValueCore et GetCurrentValue remplacer afin de valider les types de la valeur d’origine par défaut et des paramètres de valeur de destination par défaut, puis appelle GetCurrentValueCore.

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

Autres approches

Si vous souhaitez animer un type qui n’a pas d’animation From/To/By correspondante ou d’animation d’images clés, envisagez d’utiliser un ObjectAnimationUsingKeyFrames. Étant donné qu’il est faiblement typé, il ObjectAnimationUsingKeyFrames peut animer n’importe quel type de valeur. L’inconvénient de cette approche est que ObjectAnimationUsingKeyFrames seule la prise en charge de l’interpolation discrète.

Rappel image par image

Utilisez cette approche lorsque vous devez contourner complètement le système d’animation WPF. Un scénario pour cette approche est l’animation physique, où pour chaque étape animation une nouvelle direction ou position doit être recalculée pour les objets animés en fonction du dernier jeu d’interactions avec les objets.

Instructions d’implémentation

Contrairement aux autres approches décrites dans cette vue d’ensemble, le rappel image par image ne nécessite pas de créer une animation personnalisée ou une classe d’image clé.

Au lieu de cela, vous vous inscrivez à l’événement Rendering de l’objet qui contient les objets que vous souhaitez animer. Cette méthode de gestionnaire d’événements est appelée une fois par image. Chaque fois que WPF marshale les données de rendu persistantes dans l’arborescence visuelle sur l’arborescence de composition, votre méthode de gestionnaire d’événements est appelée.

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

Pour obtenir l’heure de présentation de l’image actuelle, l’événement EventArgs associé peut être casté en tant RenderingEventArgsque RenderingTime propriété que vous pouvez utiliser pour obtenir l’heure de rendu de l’image actuelle.

Pour plus d’informations, consultez la Rendering page.

Voir aussi