Partilhar via


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

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

Pré-requisitos

Para entender este tópico, você deve ser capaz de usar animações WPF para animar propriedades, conforme descrito no Animation Overview. Também ajuda a estar familiarizado com as propriedades de dependência; para obter mais informações, consulte Visão geral das propriedades de dependência .

Cronogramas e relógios

A Visão Geral da Animação descrita de que forma um Timeline representa um segmento de tempo e uma 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 Clock da linha do tempo que faz o trabalho real. Da mesma forma, a animação não anima realmente 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 direciona a saída da animação e a aplica às propriedades.

Um Clock é um tipo especial de objeto que mantém o estado de tempo de execução relacionado à temporização para o Timeline. Ele fornece três bits de informação que são essenciais para o sistema de animação e cronometragem: CurrentTime, CurrentProgresse CurrentState. Um Clock determina a sua hora, progresso e estado atuais usando os comportamentos temporais descritos por os seus Timeline: Duration, RepeatBehavior, AutoReversee assim por diante.

Na maioria das vezes, um Clock é criado automaticamente para a sua cronologia. Quando se anima utilizando um Storyboard ou o método BeginAnimation, os relógios são criados automaticamente para os seus cronogramas e animações e aplicados às suas propriedades alvo. Você também pode criar explicitamente um Clock usando o método CreateClock do seu Timeline. O método MediaTimeline.CreateClock cria um relógio do tipo apropriado para o Timeline em que o método é chamado. Se o Timeline contiver linhas do tempo filho, também criará objetos Clock para elas. Os objetos Clock resultantes são organizados em árvores que correspondem à estrutura da árvore de objetos Timeline a partir da qual são criados.

Existem 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 tipos de Timeline.

Tipo de linha cronológica 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 os seus objetos-filhos Clock
Storyboard ClockGroup Agrupa e controla os seus objetos-filhos Clock

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

Em cenários de alta exigência em termos de desempenho, como a animação de um grande número de objetos semelhantes, gerir a sua própria utilização de Clock pode proporcionar benefícios de performance.

Relógios e o Gestor de Tempo

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 objetos Clock e controla o fluxo de tempo nessa árvore. Um gerenciador de tempo é criado automaticamente para cada aplicativo WPF e é invisível para o desenvolvedor do aplicativo. O gestor de tempo "marca" muitas vezes por segundo; o número real de ticks que ocorrem a cada segundo varia dependendo dos recursos do sistema disponíveis. Durante cada um desses ticks, o gerenciador de tempo calcula o estado de todos os objetos ActiveClock na árvore de temporização.

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

Componentes do sistema de cronometragem e o gestor de tempo.
Animar uma propriedade

Quando o gerenciador de tempo marca, ele atualiza o tempo de cada ActiveClock no aplicativo. Se o Clock for um AnimationClock, ele usa o método GetCurrentValue do AnimationTimeline a partir do qual foi criado para calcular seu valor de saída atual. O AnimationClock fornece ao AnimationTimeline a hora local atual, um valor de entrada, que normalmente é o valor base da propriedade, e um valor de destino padrão. Quando se recupera o valor de uma propriedade animada por meio do método GetValue ou do seu acessador CLR, obtém-se a saída do seu AnimationClock.

Grupos de Relógios

A seção anterior descreveu como existem diferentes tipos de objetos Clock 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 classe Storyboard, que agrupa animações e outras linhas do tempo.

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

Composição

É 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 base. A ilustração a seguir mostra três objetos AnimationClock aplicados à mesma propriedade. Clock1 usa o valor base da propriedade animada como entrada e utiliza-o para gerar saída. Clock2 toma a saída de Clock1 como sua entrada e usa-a para gerar saída. Clock3 pega a saída do Clock2 como sua entrada e usa-a para gerar saída. Quando vários relógios afetam a mesma propriedade simultaneamente, diz-se que eles estão em uma cadeia de composição.

Componentes do sistema de temporização compostos com múltiplas propriedades de dependência.
Uma cadeia de composição

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

Para aplicar vários relógios à mesma propriedade, utilize o ComposeHandoffBehavior ao aplicar uma animação, Storyboardou AnimationClock.

Ticks e consolidação de eventos

Além de calcular os valores de saída, o gestor de tempo faz outro trabalho sempre que marca: determina o estado de cada relógio e gera eventos quando apropriado.

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

Quando um Clock alterna estados e volta 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 temporização, consulte a Visão geral de eventos de temporização.

Valores Atuais e Valores Base de Propriedades

Uma propriedade animatable pode ter dois valores: um valor base e um valor atual. Quando você define a propriedade usando seu acessador CLR ou o método SetValue, 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, o define o valor atual da propriedade. Recuperar o valor da propriedade por meio de seu acessador CLR ou do método GetValue retorna a saída do AnimationClock quando o AnimationClock é Active ou Filling. Você pode recuperar o valor base da propriedade usando o método GetAnimationBaseValue.

Ver também

  • Visão geral da animação
  • Visão geral dos eventos de cronometragem
  • Visão geral dos comportamentos de cronometragem