Partager via


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.

Conditions préalables

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 De/À/Par, la vue d’ensemble des animations Key-Frameet la vue d’ensemble des animations de chemin .

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

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 de AnimationTimeline ou de l’une des classes *<Type>*AnimationBase.

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

Le tableau suivant décrit certains scénarios d’extension du système d’animation.

Quand vous voulez... Utiliser cette approche
Personnaliser l’interpolation entre les valeurs d’un type qui a un *<Type correspondant>*AnimationUsingKeyFrames Créez un cadre de clé personnalisé. Pour plus d’informations, consultez la section Créer un cadre de clé personnalisé.
Personnalisez plus que l’interpolation entre les valeurs d’un type avec un *<Type>*Animation correspondant. 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éer une classe d’animation personnalisée.
Animer un type qui n’a aucune animation WPF correspondante Utilisez un ObjectAnimationUsingKeyFrames ou créez une classe qui hérite de AnimationTimeline. Pour plus d’informations, consultez la section Créer une classe d’animation personnalisée.
Animer plusieurs objets avec des valeurs qui sont calculées à chaque image et basées sur le dernier ensemble d’interactions entre objets. Utilisez le rappel par image. Pour plus d’informations, consultez la section "Créer un rappel par Per-Frame".

Créer un cadre de clé personnalisé

La création d’une classe d’images clés personnalisée est le moyen le plus simple d’étendre le système d’animation. Utilisez cette approche lorsque vous souhaitez utiliser une autre méthode d’interpolation pour une animation de trame clé. Comme décrit dans l'aperçu des animations Key-Frame, une animation d’image clé utilise des objets d’images clés pour générer ses valeurs de sortie. Chaque objet frame clé exécute trois fonctions :

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

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

  • Interpole entre la valeur du frame clé précédent 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 du frame clé. Il faut 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 propriété Value.

Étant donné que les classes *<Type>*KeyFrame héritent de la classe Freezable, vous devez également remplacer CreateInstanceCore cœur pour retourner une nouvelle instance de votre classe. Si la classe n’utilise pas les 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 remplacer des méthodes supplémentaires ; pour plus d’informations, consultez Vue d’ensemble des objets freezables.

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

Créer une classe d’animation personnalisée

La création de votre propre type d’animation vous permet de mieux contrôler la façon dont un objet est animé. Il existe deux façons recommandées de 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 ou *<Type>*AnimationUsingKeyFrames n’est pas recommandée.

Hériter de <Type>AnimationBase

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

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 une 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 également remplacer CreateInstanceCore cœur pour retourner une nouvelle instance de votre classe. Si la classe n’utilise pas les 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 remplacer des méthodes supplémentaires ; pour plus d’informations, consultez Vue d’ensemble des objets freezables.

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 l’exemple d’animation personnalisée

approches alternatives

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

Dériver de l'AnimationTimeline

Dérivez de la classe AnimationTimeline 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 classe AnimationTimeline 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 une AnimationClock. Utilisez le AnimationClock pour obtenir l’heure ou la progression actuelles 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 méthode GetCurrentValue.

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

Si la classe n’utilise pas les 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 remplacer des méthodes supplémentaires ; pour plus d’informations, consultez Vue d’ensemble des objets freezables.

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 doit remplacer la méthode TargetPropertyType. Il doit également introduire une nouvelle méthode abstraite, GetCurrentValueCore et remplacer GetCurrentValue afin qu’il valide 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 nouveau *<Type>classe *AnimationBase et remplace la méthode CreateInstanceCore, la méthode GetCurrentValueCore que vous avez introduite et la propriété IsDestinationDefault.

approches alternatives

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 une ObjectAnimationUsingKeyFrames. Étant donné qu’il est faiblement typé, un ObjectAnimationUsingKeyFrames peut animer n’importe quel type de valeur. L’inconvénient de cette approche est que ObjectAnimationUsingKeyFrames prend uniquement en charge l’interpolation discrète.

Utiliser le callback Per-Frame

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

instructions d’implémentation

Contrairement aux autres approches décrites dans cette vue d’ensemble, pour utiliser le rappel par image, vous n’avez pas besoin de créer une animation personnalisée ou une classe d’images clés.

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 vos calculs nécessaires pour votre effet d’animation et définissez les propriétés des objets que vous souhaitez animer avec ces valeurs.

Pour obtenir l’heure de présentation de l’image actuelle, l'EventArgs associée à cet événement peut être castée en tant que RenderingEventArgs, qui fournissent une propriété RenderingTime que vous pouvez utiliser pour obtenir le temps de rendu de l’image actuelle.

Pour plus d’informations, consultez la page Rendering.

Voir aussi