Vue d'ensemble de l'animation et du système de minutage
Cette rubrique décrit comment le système d'horloge utilise l'animation et les classes Timeline et Clock pour animer des propriétés.
Composants requis
Pour comprendre cette rubrique, vous devez être en mesure d'utiliser des animations WPF pour animer des propriétés, comme décrit dans Vue d'ensemble de l'animation. Cette rubrique vous aide également à vous familiariser avec les propriétés de dépendance ; pour plus d'informations, consultez le Vue d'ensemble des propriétés de dépendance.
Chronologies et horloges
L' Vue d'ensemble de l'animation a décrit comment une Timeline représente un segment de temps, et une animation un type de Timeline qui produit des valeurs de sortie. Une Timeline, par définition, ne fait rien d'autre que de décrire un segment de temps. C'est l'objet Clock de la chronologie qui fait le vrai travail. De la même façon, l'animation n'anime pas réellement de propriétés : une classe d'animation décrit comment les valeurs de sortie doivent être calculées, mais c'est l'Clock créée pour l'animation qui achemine la sortie d'animation et l'applique aux propriétés.
Une Clock est un type spécial d'objet qui conserve l'état de l'horloge au moment de l'exécution pour la Timeline. Il fournit trois bits des informations qui sont essentielles à l'animation et au système d'horodatage : CurrentTime, CurrentProgress et CurrentState. Une Clock détermine son temps réel, sa progression et son état en utilisant les comportements d'horloge décrit par son Timeline: Duration, RepeatBehavior, AutoReverse, et ainsi de suite.
Dans la plupart des cas, une Clock est créée automatiquement pour votre chronologie. Lorsque vous animez en utilisant un Storyboard ou la méthode BeginAnimation, les horloges sont créées automatiquement pour vos chronologies et animations et appliquées à leurs propriétés ciblées. Vous pouvez également créer une Clock de manière explicite à l'aide de la méthode CreateClock de votre Timeline. La méthode MediaTimeline.CreateClock crée une horloge du type approprié pour la Timeline sur laquelle elle est appelée. Si la Timeline contient des chronologies enfants, elle crée également des objets Clock pour ces dernières. Les objets Clock résultants sont disposés en arborescences qui correspondent à la structure de l'arborescence d'objets Timeline à partir de laquelle ils sont créés.
Il existe différents types d'horloges pour les types différents de chronologies. La table suivante affiche les types Clock qui correspondent à certains des différents types Timeline.
Type de chronologie |
Type d'horloge |
Objectif de l'horloge |
---|---|---|
Animation (hérite de AnimationTimeline) |
Génère des valeurs de sortie pour une propriété de dépendance. |
|
Traite un fichier multimédia. |
||
Groupe et contrôle ses objets Clock enfants |
||
Groupe et contrôle ses objets Clock enfants |
Vous pouvez appliquer tous les objets AnimationClock que vous créez aux propriétés de dépendance compatibles en utilisant la méthode ApplyAnimationClock.
Dans les scénarios aux performance intensives, tels que l'animation d'un grand nombre d'objets semblables, la gestion de votre propre utilisation de Clock peut fournir des avantages en matière de performances.
Horloges et Gestionnaire de temps
Lorsque vous animez des objets dans WPF, c'est le gestionnaire de temps qui gère les objets Clock créés pour vos chronologies. Le gestionnaire de temps est la racine d'une arborescence d'objets Clock et contrôle le flux de temps dans cette arborescence. Un gestionnaire de temps est créé automatiquement pour chaque application WPF et reste invisible au développeur d'applications. Le gestionnaire de temps "fait tic-tac" plusieurs fois par seconde ; le nombre réel des battements qui se produisent chaque seconde varie selon les ressources système disponibles. Pendant chacun de ces battements, le gestionnaire de temps calcule l'état de tous les objets ActiveClockdans l'arborescence de temps.
L'illustration suivante montre la relation entre le gestionnaire de temps et AnimationClock, et une propriété de dépendance animée.
Animer une propriété
Lorsque le gestionnaire de temps fait tic-tac, il met à jour l'heure de chaque ActiveClock dans l'application. Si l'Clock est une AnimationClock, elle utilise la méthode GetCurrentValue de la AnimationTimeline à partir de laquelle est a été créée pour calculer sa valeur de sortie réelle. L'AnimationClock donne à la AnimationTimeline l'heure locale actuelle, une valeur d'entrée, qui est en général la valeur de base de la propriété et une valeur de destination par défaut. Lorsque vous récupérez la valeur d'un animé par propriété à l'aide de la méthode GetValue ou de son accesseur CLR, vous obtenez la sortie de son AnimationClock.
Groupes d'horloges
La section précédente a décrit les différents types d'objets Clock pour différents types de chronologies. L'illustration suivante montre la relation entre le gestionnaire de temps, un ClockGroup, une AnimationClock, et une propriété de dépendance animée. Un ClockGroup est créé pour les chronologies qui groupent d'autres chronologies, telles que la classe Storyboard qui groupe des animations et d'autres chronologies.
Un groupe d'horloges
Composition
Il est possible d'associer plusieurs horloges à une propriété unique, auquel cas chaque horloge utilise la valeur de sortie de l'horloge précédente comme sa valeur de base. L'illustration suivante montre trois objets AnimationClock appliqués à la même propriété. L'horloge1 utilise la valeur de base de la propriété animée comme son entrée et l'utilise pour générer la sortie. L'horloge2 prend la sortie de l'horloge1 comme son entrée et l'utilise pour générer la sortie. L'horloge3 prend la sortie de l'horloge2 comme son entrée et l'utilise pour générer la sortie. Lorsque plusieurs horloges affectent la même propriété simultanément, ils sont considérés comme étant dans une chaîne de composition.
Une chaîne de composition
Notez que bien qu'une relation soit créée parmi l'entrée et la sortie des objets AnimationClock dans la chaîne de composition, leurs comportements d'horloge ne sont pas affectés ; les objets Clock (y compris les objets AnimationClock) ont une dépendance hiérarchique sur leurs objets Clock parents.
Pour appliquer plusieurs horloges à la même propriété, utilisez le ComposeHandoffBehaviorlors de l'application d'un Storyboard, d'une animation ou AnimationClock.
Consolidation de battements et d'événement
En plus de calculer des valeurs de sortie, le gestionnaire de temps effectue un autre travail à chaque battement : il détermine l'état de chaque horloge et déclenche les événements appropriés.
Alors que les battements se produisent fréquemment, il est possible que beaucoup de choses se passent entre les battements. Par exemple, une Clock peut être arrêtée, démarrée, arrêtée à nouveau, auquel cas sa valeur CurrentState sera modifié trois fois. En théorie, l'événement CurrentStateInvalidated pourrait être déclenché plusieurs fois dans un battement unique ; toutefois, le moteur de minutage consolide les événements, afin que l'événement CurrentStateInvalidated puisse être déclenché au plus une fois par battement. Ceci est vrai pour tous les événements d'horloge : un événement de chaque type au plus est déclenché pour un objet Clock donné.
Lorsqu'une Clock change d'état et revient à son état d'origine entre les battements (comme passer de Active à Stopped puis de nouveau à Active), l'événement associé se produit encore.
Pour plus d'informations sur les événements d'horloge, consultez Vue d'ensemble des événements de minutage.
Valeurs actuelles et valeurs de base des propriétés
Une propriété pouvant être animée peut avoir deux valeurs : une valeur de base et une valeur réelle. Lorsque vous définissez une propriété à l'aide de son accesseur CLR ou la méthode SetValue, vous définissez sa valeur de base. Lorsqu'une propriété n'est pas animée, ses valeurs de base et réelles sont identiques.
Lorsque vous animez une propriété, le AnimationClock définit la valeur réelle de la propriété. La récupération de la valeur de la propriété par le biais de son accesseur CLR ou de la méthode GetValue renvoie la sortie du AnimationClock lorsque le AnimationClock est Active ou Filling. Vous pouvez récupérer la valeur de base de la propriété à l'aide de la méthode GetAnimationBaseValue.