Share via


Visão Geral de Animação e Sistema de Tempo

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

Pré-requisitos

Para compreender esse tópico, você deve ser capaz de usar animações WPF para animar propriedades, conforme descrito em Revisão de Animação. Também ajuda estar familiarizado com propriedades de dependência; para obter mais informações, consulte o Visão geral sobre propriedades de dependência.

Linhas de tempo e relógios

O Revisão de Animação descreveu como um Timeline representa um segmento de tempo, e uma animação é um tipo de Timeline que produz 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 de tempo que faz o trabalho real. Da mesma forma, animação, na verdade, não animar 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 rege a saída de animação e aplica a propriedades.

Um Clock é um tipo especial de objeto que mantém estado relacionado a temporização em tempo de execução para o Timeline. Ele fornece três bits de informações que são essenciais para a animação e o sistema de tempo: CurrentTime, CurrentProgress, e CurrentState. A Clock Determina a time corrente, andamento e estado usando os comportamentos de temporização descritos por seu Timeline: Duration, RepeatBehavior, AutoReverse, e assim por diante.

Na maioria dos casos, um Clock é criado automaticamente para a linha de tempo. Quando você anima usando um Storyboard ou o método BeginAnimation, relógios são automaticamente criados para suas linhas de tempo e animações e aplicados às suas propriedades de destino. Você também pode criar um Clock explicitamente usando o método CreateClock de seu Timeline. O método MediaTimeline.CreateClock cria um relógio do tipo apropriado para o Timeline em que ele é chamado. Se o Timeline contiver linhas de tempo filhas, ele cria objetos Clock para eles também. Os objetos Clock resultantes são organizados em árvores que correspondam à estrutura da árvore Timeline de objetos a partir da qual foram criados.

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

Tipo de Timeline

Tipo de relógio

Finalidade do relógio

Animação (herda de AnimationTimeline)

AnimationClock

Gera valores de saída para um propriedade de dependência.

MediaTimeline

MediaClock

Processa um arquivo de mídia.

ParallelTimeline

ClockGroup

Agrupa e controla seus objetos Clock filhos

Storyboard

ClockGroup

Agrupa e controla seus objetos Clock filhos

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

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

Relógios e o Gerenciador de tempo

Quando você anima objetos em WPF, é o gerenciador de tempo que gerencia os objetos Clock criados para suas linhas de tempo. O gerenciador de tempo é a raiz de uma árvore de objetos Clock e controla o fluxo de tempo nesta árvore. Um Gerenciador de time é criado automaticamente para cada WPFaplicativo e é invisível para o desenvolvedor do aplicativo. O Gerenciador de time "tiques" muitas vezes por segundo; o número real de pulsos que ocorrem a cada segundo varia dependendo dos recursos de sistema disponível. Durante cada um desses tiques, o gerenciador de tempo calcula o estado de todos os objetos Active Clock 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.

Animando uma propriedade

Componentes do sistema de cronometragem

Quando o gerenciador de tempo faz um tique, ele atualiza o tempo de cada Active Clock no aplicativo. Se o Clock for um AnimationClock, ele usa o método GetCurrentValue do AnimationTimeline do qual ele foi criado para calcular o valor atual de saída. O AnimationClock fornece o AnimationTimeline com a hora local atual, um valor de entrada, que é geralmente o valor base da propriedade, e um valor padrão de destino. Quando você recuperar o valor de uma propriedade animada usando o método GetValue ou seu acessor CLR, você obtém a saída de seu AnimationClock.

Grupos de relógio

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

Um ClockGroup

Componentes do sistema de cronometragem

Composição

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

Uma cadeia de composição

Componentes do sistema de cronometragem

Observe que embora um relacionamento seja criado entre a entrada e a saída dos objetos AnimationClock na cadeia de composição, o comportamento de suas linhas de tempo não é afetado; objetos Clock (incluindo objetos AnimationClock) têm uma dependência hierárquica de seus objetos Clock pais.

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

Tiques e Consolidação de eventos

Como calcular valores de saída, o Gerenciador de time faz Outros trabalho nunca time que ela tiques: Ele determina o estado de cada relógio e gera eventos sistema autônomo apropriado.

Enquanto escalas ocorrerem com frequência, é possível que muita coisas ocorram entre escalas. Por exemplo, um Clock pode ser interrompido, iniciado e interrompido novamente, e nesse caso seu valor CurrentState terá sido alterado três vezes. Em teoria, o evento CurrentStateInvalidated pode ser gerado várias vezes em um único tique; no entanto, o mecanismo de temporização consolida eventos, de modo que cada 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 de volta ao seu estado original entre tiques (tal como alterar de Active para Stopped e voltar para Active), o evento associado ainda ocorre.

Para obter mais informações sobre eventos de temporização , consulte Visão geral Eventos de Temporizadores.

Valores atuais e Valores Base de propriedades

Uma propriedade animáveis pode ter dois valores: valor base e um valor corrente. Quando você define a propriedade usando seu acessor CLR ou o método SetValue, você define seu valor base. Quando uma propriedade não é animada, seus valores atuais e base são os mesmos.

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

Consulte também

Conceitos

Revisão de Animação

Visão geral Eventos de Temporizadores

Visão geral sobre comportamentos de temporização