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.
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.
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.
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
Ver também
.NET Desktop feedback