Compartilhar via


Visão geral do sistema de animação e temporização

Este tópico descreve como o sistema de temporização usa as classes de animação, Timeline e Clock, para animar propriedades.

Pré-requisitos

Para entender este tópico, você deve ser capaz de usar animações do WPF para animar propriedades, conforme descrito na Visão Geral da Animação. Ele também ajuda a se familiarizar com as propriedades de dependência; para obter mais informações, consulte a Visão geral das propriedades de dependência.

Cronogramas e relógios

A Visão geral da animação descreveu como um Timeline representa um segmento de tempo e como a animação é um tipo de Timeline que gera valores de saída. Por si só, um Timeline. não faz nada além de apenas descrever um segmento de tempo. É o objeto da linha temporal do Clock que faz o trabalho real. Da mesma forma, a animação não anima as propriedades: uma classe de animação descreve como os valores de saída devem ser calculados, mas é o Clock criado para a animação que controla a saída da animação e a aplica às propriedades.

Um Clock é um tipo especial de objeto que mantém o estado de execução relacionado ao tempo para o Timeline. Ele fornece três bits de informações que são essenciais para o sistema de animação e tempo: CurrentTime, CurrentProgresse CurrentState. A Clock determina seu tempo, progresso e estado atuais usando os comportamentos de tempo descritos por seu Timeline: Duration, , RepeatBehaviore AutoReverseassim por diante.

Na maioria dos casos, um Clock é criado automaticamente para sua linha do tempo. Quando você anima usando um Storyboard ou o método BeginAnimation, os clocks são criados automaticamente para suas linhas do tempo e animações e aplicados às suas propriedades de destino. Você também pode criar um Clock explicitamente usando o método CreateClock do seu Timeline. O MediaTimeline.CreateClock método cria um relógio do tipo apropriado para o Timeline para o qual ele é chamado. Caso Timeline contenha sub-linhas do tempo, ele também criará objetos Clock para elas. Os objetos resultantes Clock são organizados em árvores que correspondem à estrutura da árvore de Timeline objetos da qual são criados.

Há diferentes tipos de relógios para diferentes tipos de linhas do tempo. A tabela a seguir mostra os Clock tipos que correspondem a alguns dos diferentes Timeline tipos.

Tipo de linha do tempo Tipo de relógio Finalidade do relógio
Animação (herda de AnimationTimeline) AnimationClock Gera valores de saída para uma propriedade de dependência.
MediaTimeline MediaClock Processa um arquivo de mídia.
ParallelTimeline ClockGroup Agrupa e controla seus objetos filhos Clock
Storyboard ClockGroup Agrupa e controla seus objetos filhos Clock

Você pode aplicar todos AnimationClock os objetos criados para propriedades de dependência compatíveis usando o ApplyAnimationClock método.

Em cenários com uso intensivo de desempenho, como animar um grande número de objetos semelhantes, gerenciar seu próprio Clock uso pode fornecer benefícios de desempenho.

Relógios e o Gerenciador de Horários

Quando você anima objetos no WPF, é o gerenciador de tempo que gerencia os Clock objetos criados para suas linhas do tempo. O gerenciador de tempo é a raiz de uma árvore de Clock objetos e controla o fluxo de tempo nessa árvore. Um gerenciador de horários é criado automaticamente para cada aplicativo WPF e é invisível para o desenvolvedor de aplicativos. O gerenciador de tempo "tique" muitas vezes por segundo; o número real de tiques que ocorrem a cada segundo varia dependendo dos recursos disponíveis do sistema. Durante cada um desses ciclos, o gerenciador de tempo calcula o estado de todos os ActiveClock objetos na árvore de temporização.

A ilustração a seguir mostra a relação entre o gerenciador de tempo, e AnimationClock, e uma propriedade de dependência animada.

Componentes do sistema de tempo e o gerenciador de tempo.
Animando uma propriedade

Quando o gerenciador de tempo marca, ele atualiza o horário de cada ActiveClock no aplicativo. Se o Clock for um AnimationClock, ele usará o método GetCurrentValue do AnimationTimeline a partir do qual foi criado para calcular seu valor de saída atual. O AnimationClock fornece a AnimationTimeline hora local atual, um valor de entrada, que normalmente é o valor base da propriedade e um valor de destino padrão. Ao recuperar o valor de uma propriedade animada usando o GetValue método ou seu acessador CLR, você obtém a saída de sua AnimationClock.

Grupos de Relógios

A seção anterior descreveu como há diferentes tipos de Clock objetos para diferentes tipos de linhas do tempo. A ilustração a seguir mostra a relação entre o gerenciador de tempo, um ClockGroup, um AnimationClocke uma propriedade de dependência animada. Um ClockGroup é criado para linhas do tempo que agrupam outras linhas do tempo, como a Storyboard classe, que agrupa animações e outras linhas do tempo.

Componentes do sistema de temporização com o gerenciador de tempo e as propriedades de dependência.
Um Grupo de Relógios

Composição

É possível associar vários relógios a uma única propriedade, nesse caso, cada relógio usa o valor de saída do relógio anterior como seu valor base. A ilustração a seguir mostra três AnimationClock objetos aplicados à mesma propriedade. Clock1 utiliza o valor base da propriedade animada como entrada e o utiliza para gerar a saída. Clock2 usa a saída do Clock1 como entrada e a usa para gerar saída. O Clock3 usa a saída do Clock2 como entrada e a usa para gerar saída. Quando vários relógios afetam a mesma propriedade simultaneamente, considera-se que eles estão em uma cadeia de composição.

Componentes do sistema de tempo compostos com várias propriedades de dependência.
Uma cadeia de composição

Observe que, embora uma relação seja criada entre a entrada e a saída AnimationClock dos objetos na cadeia de composição, os seus comportamentos temporais não são afetados; Clock objetos (incluindo AnimationClock objetos) têm uma dependência hierárquica em relação aos seus objetos pai Clock.

Para aplicar vários relógios à mesma propriedade, use o ComposeHandoffBehavior ao aplicar um Storyboard, uma animação, ou AnimationClock.

Tiques e consolidação de eventos

Além de calcular valores de saída, o gerenciador de tempo faz outro trabalho a cada tique: determina o estado de cada relógio e dispara eventos conforme apropriado.

Embora os tiques ocorram com frequência, é possível que muitas coisas aconteçam entre tiques. Por exemplo, um Clock pode ser interrompido, iniciado e interrompido novamente, nesse caso, seu CurrentState valor terá sido alterado três vezes. Em teoria, o evento CurrentStateInvalidated pode ser gerado várias vezes em um único tique; no entanto, o motor de temporização consolida os eventos, de forma que o evento CurrentStateInvalidated possa ser gerado no máximo uma vez por tique. Isso é verdadeiro para todos os eventos de tempo: no máximo um evento de cada tipo é gerado para um determinado Clock objeto.

Quando um Clock alterna estados e retorna ao seu estado original entre ciclos (como mudar de Active para Stopped e voltar para Active), o evento associado ainda ocorre.

Para obter mais informações sobre eventos de tempo, consulte a Visão geral de eventos de tempo.

Valores atuais e valores base de propriedades

Uma propriedade animatável pode ter dois valores: um valor base e um valor atual. Ao definir a propriedade usando seu acessador CLR ou o SetValue método, você define seu valor base. Quando uma propriedade não é animada, seus valores base e atual são os mesmos.

Quando você anima uma propriedade, define o AnimationClock valor atual da propriedade. Recuperar o valor da propriedade por meio de seu acessador CLR ou o método GetValue retorna a saída de AnimationClock quando o AnimationClock é Active ou Filling. Você pode recuperar o valor base da propriedade usando o GetAnimationBaseValue método.

Consulte também