Visão geral da animação e do sistema de tempoAnimation and Timing System Overview

Este tópico descreve como o sistema de temporização usa a animação Timeline, e Clock classes para animar propriedades.This topic describes how the timing system uses the animation, Timeline, and Clock classes to animate properties.

Pré-requisitosPrerequisites

Para entender esse tópico, você deve ser capaz de usar WPFWPF animações para animar propriedades, conforme descrito na Visão geral da animação.To understand this topic, you should be able to use WPFWPF animations to animate properties, as described in the Animation Overview. Ele também ajuda a se familiarizar com as propriedades de dependência; para obter mais informações, consulte o visão geral das propriedades de dependência.It also helps to be familiar with dependency properties; for more information, see the Dependency Properties Overview.

Linhas de tempo e relógiosTimelines and Clocks

O visão geral da animação descrito como um Timeline representa um segmento de tempo e uma animação é um tipo de Timeline que produz valores de saída.The Animation Overview described how a Timeline represents a segment of time, and an animation is a type of Timeline that produces output values. Por si só, um Timeline, não faz nada além de apenas descrever um segmento de tempo.By itself, a Timeline, doesn't do anything other than just describe a segment of time. É a linha do tempo Clock objeto que faz o trabalho real.It's the timeline's Clock object that does the real work. Da mesma forma, animação, na verdade, não anima propriedades: uma classe de animação descreve como valores de saída devem ser calculados, mas é o Clock que foi criado para a animação que conduz a saída da animação e a aplica às propriedades.Likewise, animation doesn't actually animate properties: an animation class describes how output values should be calculated, but it’s the Clock that was created for the animation that drives the animation output and applies it to properties.

Um Clock é um tipo especial de objeto que mantém o estado de tempo de execução relacionado à temporização para a Timeline.A Clock is a special type of object that maintains timing-related run-time state for the Timeline. Ele fornece três partes de informações que são essenciais para a animação e o sistema de temporização: CurrentTime, CurrentProgress, e CurrentState.It provides three bits of information that are essential to the animation and timing system: CurrentTime, CurrentProgress, and CurrentState. Um Clock determina sua hora atual, andamento e estado usando os comportamentos de temporização descritos pelo seu Timeline: Duration, RepeatBehavior, AutoReversee assim por diante.A Clock determines its current time, progress, and state by using the timing behaviors described by its Timeline: Duration, RepeatBehavior, AutoReverse, and so on.

Na maioria dos casos, um Clock é criado automaticamente para sua linha do tempo.In most cases, a Clock is created automatically for your timeline. Quando você anima usando um Storyboard ou o BeginAnimation método, relógios são automaticamente criados para suas linhas do tempo e animações e aplicados às suas propriedades de destino.When you animate by using a Storyboard or the BeginAnimation method, clocks are automatically created for your timelines and animations and applied to their targeted properties. Você também pode criar uma Clock explicitamente, usando o CreateClock método do seu Timeline.You can also create a Clock explicitly by using the CreateClock method of your Timeline. O MediaTimeline.CreateClock método cria um relógio do tipo apropriado para o Timeline no qual ele é chamado.The MediaTimeline.CreateClock method creates a clock of the appropriate type for the Timeline on which it is called. Se o Timeline contém as linhas do tempo filho, ele cria Clock objetos para que eles também.If the Timeline contains child timelines, it creates Clock objects for them as well. Resultante Clock objetos são organizados em árvores que correspondam à estrutura do Timeline objetos de árvore da qual eles são criados.The resulting Clock objects are arranged in trees that match the structure of the Timeline objects tree from which they are created.

Existem diferentes tipos de relógios para tipos diferentes de linhas de tempo.There are different types of clocks for different types of timelines. A tabela a seguir mostra a Clock tipos que correspondem a alguns dos diferentes Timeline tipos.The following table shows the Clock types that correspond to some of the different Timeline types.

Tipo de linha do tempoTimeline type Tipo de RelógioClock type Finalidade do relógioClock purpose
Animação (herda de AnimationTimeline)Animation (inherits from AnimationTimeline) AnimationClock Gera valores de saída para uma propriedade de dependência.Generates output values for a dependency property.
MediaTimeline MediaClock Processa um arquivo de mídia.Processes a media file.
ParallelTimeline ClockGroup Agrupa e controla seu filho Clock objetosGroups and controls its child Clock objects
Storyboard ClockGroup Agrupa e controla seu filho Clock objetosGroups and controls its child Clock objects

Você pode aplicar qualquer AnimationClock objetos que você criar a propriedades de dependência compatíveis usando o ApplyAnimationClock método.You can apply any AnimationClock objects you create to compatible dependency properties by using the ApplyAnimationClock method.

Em cenários de alto desempenho, como animação de grande número de objetos semelhantes, gerenciar seu próprio Clock uso pode fornecer benefícios de desempenho.In performance-intensive scenarios, such as animating large numbers of similar objects, managing your own Clock use can provide performance benefits.

Relógios e o Gerenciador de tempoClocks and the Time Manager

Quando você anima objetos em WPFWPF, é o Gerenciador de tempo que gerencia o Clock objetos criados para suas linhas do tempo.When you animate objects in WPFWPF, it’s the time manager that manages the Clock objects created for your timelines. O Gerenciador de tempo é a raiz de uma árvore de Clock objetos e controla o fluxo de tempo nesta árvore.The time manager is the root of a tree of Clock objects and controls the flow of time in that tree. Um Gerenciador de tempo é automaticamente criado para cada WPFWPF aplicativo e é invisível para o desenvolvedor do aplicativo.A time manager is automatically created for each WPFWPF application and is invisible to the application developer. O Gerenciador de tempo "faz tiques" muitas vezes por segundo; o número real de tiques que ocorrem em cada segundo varia dependendo dos recursos disponíveis no sistema.The time manager "ticks" many times per second; the actual number of ticks that occur each second varies depending on available system resources. Durante cada um desses tiques, o Gerenciador de tempo calcula o estado de todos os Active Clock objetos na árvore de temporização.During each one of these ticks, the time manager computes the state of all Active Clock objects in the timing tree.

A ilustração a seguir mostra a relação entre o Gerenciador de tempo e AnimationClocke uma propriedade de dependência animada.The following illustration shows the relationship between the time manager, and AnimationClock, and an animated dependency property.

Componentes do sistema de tempoTiming system components
Animar uma propriedadeAnimating a property

Quando o Gerenciador de tempo faz um tique, ele atualiza o tempo de cada Active Clock no aplicativo.When the time manager ticks, it updates the time of every Active Clock in the application. Se o Clock é um AnimationClock, ele usa o GetCurrentValue método da AnimationTimeline do qual ele foi criado calcular seu valor de saída.If the Clock is an AnimationClock, it uses the GetCurrentValue method of the AnimationTimeline from which it was created to calculate its current output value. O AnimationClock fornece o AnimationTimeline com a hora local atual, um valor de entrada, que normalmente é o valor base da propriedade e um valor de destino padrão.The AnimationClock supplies the AnimationTimeline with the current local time, an input value, which is typically the base value of the property, and a default destination value. Quando você recuperar o valor de uma imagem por meio da propriedade a GetValue método ou seu acessador CLR, você obtém a saída de seu AnimationClock.When you retrieve the value of an animated by property using the GetValue method or its CLR accessor, you get the output of its AnimationClock.

Grupos de relógioClock Groups

A seção anterior descreveu como existem diferentes tipos de Clock objetos para tipos diferentes de linhas do tempo.The preceding section described how there are different types of Clock objects for different types of timelines. A ilustração a seguir mostra a relação entre o Gerenciador de tempo, uma ClockGroup, um AnimationClocke uma propriedade de dependência animada.The following illustration shows the relationship between the time manager, a ClockGroup, an AnimationClock, and an animated dependency property. Um ClockGroup é criado para linhas de tempo que agrupam outras linhas de tempo, como o Storyboard classe, que agrupa as animações e outras linhas de tempo.A ClockGroup is created for timelines that group other timelines, such as the Storyboard class, which groups animations and other timelines.

Componentes do sistema de tempoTiming system components
Um ClockGroupA ClockGroup

ComposiçãoComposition

É possível associar vários relógios a uma única propriedade, caso em que cada relógio usa o valor de saída do relógio anterior como seu valor de base.It's possible to associate multiple clocks with a single property, in which case each clock uses the output value of the preceding clock as its base value. A ilustração a seguir mostra três AnimationClock objetos aplicados à mesma propriedade.The following illustration shows three AnimationClock objects applied to the same property. Relógio1 usa o valor base da propriedade animada como sua entrada e usa-o para gerar a saída.Clock1 uses the base value of the animated property as its input and uses it to generate output. Relógio2 usa a saída do Relógio1 como sua entrada e usa-o para gerar a saída.Clock2 takes the output from Clock1 as its input and uses it to generate output. Relógio3 usa a saída do Relógio2 como sua entrada e usa-o para gerar a saída.Clock3 takes the output from Clock2 as its input and uses it to generate output. Quando vários relógios afetam a mesma propriedade simultaneamente, eles devem estar em uma cadeia de composição.When multiple clocks affect the same property simultaneously, they are said to be in a composition chain.

Componentes do sistema de tempoTiming system components
Uma cadeia de composiçãoA composition chain

Observe que, embora uma relação é criada entre a entrada e saída do AnimationClock objetos na cadeia de composição, seus comportamentos de tempo não são afetados; Clock objetos (incluindo AnimationClock objetos) têm uma dependência hierárquica de seus pais Clock objetos.Note that although a relationship is created among the input and output of the AnimationClock objects in the composition chain, their timing behaviors are not affected; Clock objects (including AnimationClock objects) have a hierarchical dependency on their parent Clock objects.

Para aplicar vários relógios à mesma propriedade, use o Compose HandoffBehavior ao aplicar uma Storyboard, animação, ou AnimationClock.To apply multiple clocks to the same property, use the Compose HandoffBehavior when applying a Storyboard, animation, or AnimationClock.

Tiques e consolidação de eventosTicks and Event Consolidation

Além de calcular valores de saída, o Gerenciador de tempo faz outra tarefa toda vez que ele faz um tique: ele determina o estado de cada relógio e gera eventos conforme apropriado.In addition to calculating output values, the time manager does other work every time it ticks: it determines the state of each clock and raises events as appropriate.

Enquanto tiques ocorrerem com frequência, é possível que muitas coisas ocorram entre tiques.While ticks occur frequently, it's possible for a lot of things to happen between ticks. Por exemplo, uma Clock pode ser interrompido, iniciado e interrompido novamente, caso em que seu CurrentState valor terá sido alterado três vezes.For example, a Clock might be stopped, started, and stopped again, in which case its CurrentState value will have changed three times. Em teoria, o CurrentStateInvalidated evento pode ser gerado várias vezes em um único tique; no entanto, o mecanismo de temporização consolida eventos, para que o CurrentStateInvalidated evento pode ser gerado no máximo uma vez por tique.In theory, the CurrentStateInvalidated event could be raised multiple times in a single tick; however, the timing engine consolidates events, so that the CurrentStateInvalidated event can be raised at most once per tick. Isso é verdadeiro para todos os eventos de temporização: no máximo um evento de cada tipo é gerado para um determinado Clock objeto.This is true for all timing events: at most one event of each type is raised for a given Clock object.

Quando um Clock alterna estados e retorna ao estado original entre tiques (como alterar de Active à Stopped e de volta para Active), o evento associado ainda ocorre.When a Clock switches states and returns back to its original state between ticks (such as changing from Active to Stopped and back to Active), the associated event still occurs.

Para obter mais informações sobre eventos de temporização, consulte a visão geral dos eventos de tempo.For more information about timing events, see the Timing Events Overview.

Valores atuais e valores base de propriedadesCurrent Values and Base Values of Properties

Uma propriedade animável pode ter dois valores: um valor base e um valor atual.An animatable property can have two values: a base value and a current value. Quando você define a propriedade usando seu acessador CLR ou o SetValue método, você define seu valor base.When you set property using its CLR accessor or the SetValue method, you set its base value. Quando uma propriedade não é animada, seus valores atuais e base são os mesmos.When a property is not animated, its base and current values are the same.

Ao animar uma propriedade, o AnimationClock define a propriedade atual valor.When you animate a property, the AnimationClock sets the property's current value. Recuperando o valor da propriedade por meio de seu acessador CLR ou o GetValue método retorna a saída do AnimationClock quando o AnimationClock é Active ou Filling.Retrieving the property's value through its CLR accessor or the GetValue method returns the output of the AnimationClock when the AnimationClock is Active or Filling. Você pode recuperar o valor da propriedade base usando o GetAnimationBaseValue método.You can retrieve the property's base value by using the GetAnimationBaseValue method.

Consulte tambémSee also