Visão geral da animação e do sistema de tempo
Este tópico descreve como o sistema de temporização usa a animação Timelinee Clock as classes para animar propriedades.
Pré-requisitos
Para entender este tópico, você deve ser capaz de usar animações 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 o visão geral das propriedades de dependência.
Linhas de tempo e relógios
A Visão geral da animação descreveu como um representa um segmento de tempo, e uma animação é um Timeline tipo de que produz valores de Timeline saída. Por si só, um , não faz nada além de apenas descrever um Timelinesegmento de tempo. É o objeto da linha do Clock tempo que faz o trabalho real. Da mesma forma, a animação não anima propriedades: uma classe de animação descreve como os valores de saída devem ser calculados, mas é o que foi criado para a animação que direciona a saída da animação e a Clock aplica às propriedades.
A Clock é um tipo especial de objeto que mantém o estado de tempo de execução relacionado ao tempo de execução para o Timeline. Ele fornece três bits de informação que são essenciais para o sistema de animação e temporização: CurrentTime, CurrentProgresse CurrentState. A Clock determina seu tempo atual, progresso e estado usando os comportamentos de tempo descritos por seu Timeline: Duration, , RepeatBehaviorAutoReversee assim por diante.
Na maioria dos casos, um Clock é criado automaticamente para sua linha do tempo. Quando você anima usando um Storyboard ou o BeginAnimation método, os relógios 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 CreateClock método do seu Timeline. O MediaTimeline.CreateClock método cria um relógio do tipo apropriado para o Timeline qual ele é chamado. Se o Timeline contém linhas do tempo filho, ele cria Clock objetos para eles também. Os objetos resultantes Clock são organizados em árvores que correspondem à Timeline estrutura da árvore de objetos a partir da qual são criados.
Existem diferentes tipos de relógios para tipos diferentes de linhas de tempo. A tabela a seguir mostra os tipos que correspondem a Clock 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 filho Clock |
Storyboard | ClockGroup | Agrupa e controla seus objetos filho Clock |
Você pode aplicar qualquer AnimationClock objeto criado a propriedades de dependência compatíveis usando o ApplyAnimationClock método.
Em cenários de alto desempenho, como a animação de um grande número de objetos semelhantes, o gerenciamento de seu próprio Clock uso pode fornecer benefícios de desempenho.
Relógios e o Gerenciador 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 e controla o fluxo de Clock tempo nessa árvore. Um gerenciador de tempo é criado automaticamente para cada aplicativo WPF e é invisível para o desenvolvedor do aplicativo. O Gerenciador de tempo "faz tiques" muitas vezes por segundo; o número real de tiques que ocorrem em cada segundo varia dependendo dos recursos disponíveis no sistema. Durante cada um desses ticks, 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 , e AnimationClockuma 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 é um AnimationClock, ele usa o GetCurrentValueAnimationTimeline método do qual ele 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. Quando você recupera o valor de uma propriedade animada por usando o GetValue método ou seu acessador CLR, você obtém a saída de seu AnimationClock.
Grupos de relógio
A seção anterior descreveu como há diferentes tipos de objetos para diferentes tipos de Clock linhas do tempo. A ilustração a seguir mostra a relação entre o gerenciador de tempo, um , um ClockGroupAnimationClocke uma propriedade de dependência animada. A 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.
Um ClockGroup
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 de base. A ilustração a seguir mostra três AnimationClock objetos aplicados à mesma propriedade. Relógio1 usa o valor base da propriedade animada como sua entrada e usa-o para gerar a saída. Relógio2 usa a saída do Relógio1 como sua entrada e usa-o para gerar a saída. Relógio3 usa a saída do Relógio2 como sua entrada e usa-o para gerar a saída. Quando vários relógios afetam a mesma propriedade simultaneamente, eles devem estar em uma cadeia de composição.
Uma cadeia de composição
Observe que, embora uma relação seja criada entre a entrada e a saída dos objetos na cadeia de composição, seus comportamentos de temporização não são afetados: Clock os objetos (incluindo AnimationClock objetos) têm uma dependência hierárquica de AnimationClock seus objetos paiClock.
Para aplicar vários relógios à mesma propriedade, use o ComposeHandoffBehavior ao aplicar uma Storyboardanimação , ou AnimationClock.
Tiques e consolidação de eventos
Além de calcular valores de saída, o Gerenciador de tempo faz outra tarefa toda vez que ele faz um tique: ele determina o estado de cada relógio e gera eventos conforme apropriado.
Enquanto tiques ocorrerem com frequência, é possível que muitas coisas ocorram entre tiques. Por exemplo, um Clock pode ser interrompido, iniciado e parado novamente, caso em que seu CurrentState valor terá sido alterado três vezes. Em teoria, o evento poderia ser gerado várias vezes em um único tick, no entanto, o mecanismo de temporização consolida os eventos, de modo que o CurrentStateInvalidatedCurrentStateInvalidated evento pode ser aumentado no máximo uma vez por tick. Isso é verdadeiro para todos os eventos de temporização: 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 ticks (como mudar de Active para e voltar para StoppedActive), o evento associado ainda ocorre.
Para obter mais informações sobre eventos de temporização, consulte a visão geral dos eventos de tempo.
Valores atuais e valores base de propriedades
Uma propriedade animá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 atuais e base são os mesmos.
Quando você anima uma propriedade, o define o AnimationClock valor atual da propriedade. Recuperando o valor da propriedade por meio de seu acessador CLR ou o método retorna a saída do quando o GetValueAnimationClock é Active ou Filling.AnimationClock Você pode recuperar o valor base da propriedade usando o GetAnimationBaseValue método.
Confira também
.NET Desktop feedback
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de