Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico descreve como e quando estender o sistema de animação WPF ao criar quadros-chave personalizados, classes de animação ou utilizando uma chamada de retorno por quadro para o ignorar.
Pré-requisitos
Para entender este tópico, você deve estar familiarizado com os diferentes tipos de animações fornecidas pelo WPF. Para obter mais informações, consulte a Visão Geral de Animações De/Para/Por, a Visão Geral de AnimaçõesKey-Frame e a Visão Geral de Animações de Caminho.
Como as classes de animação herdam da Freezable classe, você deve estar familiarizado com Freezable objetos e como herdar do Freezable. Para obter mais informações, consulte a Visão geral de objetos Freezable.
Estendendo o sistema de animação
Há várias maneiras de estender o sistema de animação WPF, dependendo do nível de funcionalidade interna que você deseja usar. Há três pontos de extensibilidade principais no mecanismo de animação WPF:
Crie um objeto de quadro-chave personalizado herdando de uma das classes *<Type>*KeyFrame, como DoubleKeyFrame. Essa abordagem usa a maioria das funcionalidades internas do mecanismo de animação WPF.
Crie sua própria classe de animação herdando de AnimationTimeline ou uma das classes *<Type>*AnimationBase.
Utilize a função de retorno por quadro para gerar animações com base em cada quadro. Esta abordagem ignora completamente o sistema de animação e cronometragem.
A tabela a seguir descreve alguns cenários para estender o sistema de animação.
| Quando você quer... | Use esta abordagem |
|---|---|
| Personalize a interpolação entre valores de um tipo que possua um *<Type>*AnimationUsingKeyFrames correspondente | Crie um quadro-chave personalizado. Para obter mais informações, consulte a seção Criar um quadro-chave personalizado . |
| Personalize mais do que apenas a interpolação entre valores de um tipo que possua uma animação correspondente *<Type>*Animation. | Crie uma classe de animação personalizada que herda da classe *<Type>*AnimationBase que corresponde ao tipo que você deseja animar. Para obter mais informações, consulte a seção Criar uma classe de animação personalizada . |
| Animar um tipo que não possui uma animação correspondente no WPF | Use um ObjectAnimationUsingKeyFrames ou crie uma classe que herda de AnimationTimeline. Para obter mais informações, consulte a seção Criar uma classe de animação personalizada . |
| Animar vários objetos com valores que são calculados em cada quadro e são baseados no último conjunto de interações de objeto | Utilize o retorno de chamada por frame. Para obter mais informações, consulte a seção Criar uma chamada de retorno Per-Frame. |
Criar um quadro-chave personalizado
Criar uma classe de quadro-chave personalizada é a maneira mais simples de estender o sistema de animação. Use essa abordagem quando quiser um método de interpolação diferente para uma animação de quadro-chave. Conforme descrito na Visão Geral das Animações deKey-Frame, uma animação de fotograma-chave utiliza objetos de fotograma-chave para gerar os seus valores de saída. Cada objeto de quadro-chave executa três funções:
Especifica um valor de destino usando sua Value propriedade.
Especifica o momento em que esse valor deve ser alcançado usando sua KeyTime propriedade.
Interpola entre o valor do quadro-chave anterior e seu próprio valor implementando o método InterpolateValueCore.
Instruções de implementação
Derive da classe abstrata *<Type>*KeyFrame e implemente o método InterpolateValueCore. O método InterpolateValueCore retorna o valor atual do quadro-chave. São necessários dois parâmetros: o valor do quadro-chave anterior e um valor de progresso que varia de 0 a 1. Um progresso de 0 indica que o quadro-chave acabou de começar e um valor de 1 indica que o quadro-chave acabou de ser concluído e deve retornar o valor especificado por sua Value propriedade.
Como as classes *<Type>*KeyFrame herdam da classe Freezable, você também deve sobrepor o núcleo CreateInstanceCore para retornar uma nova instância da sua classe. Se a classe não usar propriedades de dependência para armazenar seus dados ou se exigir inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; consulte a Visão geral de objetos Freezable para obter mais informações.
Depois de criar a sua animação personalizada *<Type>*KeyFrame, pode usá-la com a *<Type>*AnimationUsingKeyFrames para esse tipo específico.
Criar uma classe de animação personalizada
Criar seu próprio tipo de animação lhe dá mais controle sobre como um objeto é animado. Há duas maneiras recomendadas de criar seu próprio tipo de animação: você pode derivar da AnimationTimeline classe ou da classe *<Type>*AnimationBase. Derivar das classes *<Type>*Animation ou *<Type>*AnimationUsingKeyFrames não é recomendado.
Derive de <Type>AnimationBase
Derivar de uma classe *<Type>*AnimationBase é a maneira mais simples de criar um novo tipo de animação. Use essa abordagem quando quiser criar uma nova animação para o tipo que já tenha uma classe *<Type>*AnimationBase correspondente.
Instruções de implementação
Derive de uma classe *<Type>*Animation e implemente o método GetCurrentValueCore. O GetCurrentValueCore método retorna o valor atual da animação. São necessários três parâmetros: um valor inicial sugerido, um valor final sugerido e um AnimationClock, que você usa para determinar o progresso da animação.
Como as classes *<Type>*AnimationBase herdam da Freezable class, você também deve sobrescrever o CreateInstanceCore core para retornar uma nova instância da sua classe. Se a classe não usar propriedades de dependência para armazenar seus dados ou se exigir inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; consulte a Visão geral de objetos Freezable para obter mais informações.
Para obter mais informações, consulte a documentação do método GetCurrentValueCore para a classe *<Type>*AnimationBase para o tipo que você deseja animar. Para obter um exemplo, consulte o Exemplo de animação personalizada
Abordagens alternativas
Se você quiser simplesmente alterar como os valores de animação são interpolados, considere derivar de uma das classes *<Type>*KeyFrame. O quadro-chave que você cria pode ser usado com o *<Type>*AnimationUsingKeyFrames correspondente fornecido pelo WPF.
Derivar de AnimationTimeline
Derive da classe AnimationTimeline quando quiser criar uma animação para um tipo que ainda não tenha uma animação WPF correspondente ou quiser criar uma animação que não seja fortemente tipificada.
Instruções de implementação
Derivar da AnimationTimeline classe e substituir os seguintes membros:
CreateInstanceCore – Se sua nova classe for concreta, você deve substituir CreateInstanceCore para retornar uma nova instância de sua classe.
GetCurrentValue – Sobrescreva este método para retornar o valor atual da sua animação. São necessários três parâmetros: um valor de origem padrão, um valor de destino padrão e um AnimationClock. Use o AnimationClock para obter a hora ou o progresso atuais da animação. Você pode escolher se deseja usar os valores de origem e destino padrão.
IsDestinationDefault – Substitua a propriedade GetCurrentValue para indicar se a sua animação usa o valor de destino padrão especificado pelo método.
TargetPropertyType – Sobreponha esta propriedade para indicar a Type da saída que a sua animação produz.
Se a classe não usar propriedades de dependência para armazenar seus dados ou se exigir inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; consulte a Visão geral de objetos Freezable para obter mais informações.
O paradigma recomendado (usado por animações WPF) é usar dois níveis de herança:
Crie uma classe abstrata *<Type>*AnimationBase que deriva de AnimationTimeline. Esta classe deve substituir o TargetPropertyType método. Ele também deve introduzir um novo método abstrato, GetCurrentValueCore, e substituir GetCurrentValue para que valide os tipos do valor de origem padrão e parâmetros de valor de destino padrão e, em seguida, chame GetCurrentValueCore.
Crie outra classe que herda de sua nova classe *<Type>*AnimationBase e substitua o CreateInstanceCore método, o método GetCurrentValueCore que você introduziu e a IsDestinationDefault propriedade.
Abordagens alternativas
Se pretender animar um tipo que não tenha uma animação De/Para/Por correspondente ou uma animação de quadro-chave, considere usar um ObjectAnimationUsingKeyFrames. Por ser fracamente digitado, um ObjectAnimationUsingKeyFrames pode animar qualquer tipo de valor. A desvantagem desta abordagem é que ObjectAnimationUsingKeyFrames apenas suporta interpolação discreta.
Usar Per-Frame retorno de chamada
Use essa abordagem quando precisar ignorar completamente o sistema de animação WPF. Um cenário para essa abordagem são as animações físicas, onde a cada passo de animação uma nova direção ou posição de objetos animados precisa ser recalculada com base no último conjunto de interações de objetos.
Instruções de implementação
Ao contrário das outras abordagens descritas neste resumo, para usar callback por quadro, você não precisa criar uma animação personalizada ou uma classe de quadro-chave.
Em vez disso, você se registra para o Rendering evento do objeto que contém os objetos que você deseja animar. Esse método manipulador de eventos é chamado uma vez por quadro. Cada vez que o WPF transfere os dados de renderização persistentes da árvore visual para a árvore de composição, o seu método manipulador de eventos é chamado.
No manipulador de eventos, execute os cálculos necessários para o efeito de animação e defina as propriedades dos objetos que deseja animar com esses valores.
Para obter o tempo de apresentação do quadro atual, o EventArgs associado a esse evento pode ser convertido como RenderingEventArgs, que fornece uma RenderingTime propriedade que você pode usar para obter o tempo de renderização do quadro atual.
Para obter mais informações, consulte a Rendering página.
Ver também
- AnimationTimeline
- IKeyFrame
- Visão Geral das Técnicas de Animação de Propriedades
- Visão geral de objetos congeláveis
- Visão geral das animações Key-Frame
- Visão geral das animações de caminho
- Visão geral da animação
- Visão geral do sistema de animação e cronometragem
- Exemplo de animação personalizada
.NET Desktop feedback