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 :
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.
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
- AnimationTimeline
- IKeyFrame
- Vue d’ensemble des techniques d’animation de propriété
- Vue d’ensemble des objets gelables
- Vue d’ensemble des animations Key-Frame
- Vue d’ensemble des animations de trajectoire
- Vue d’ensemble de l’animation
- Vue d’ensemble de l’animation et du système de minutage
- exemple d’animation personnalisée
.NET Desktop feedback