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) |
Gera valores de saída para um propriedade de dependência. |
|
Processa um arquivo de mídia. |
||
Agrupa e controla seus objetos Clock filhos |
||
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
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
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
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.