Visão Geral de Animações Personalizadas
Este tópico descreve como e quando estender o sistema de animação do WPF criando quadros-chave personalizados, classes de animação ou utilizando callback por quadro para contorná-lo.
Pré-requisitos
Para entender este tópico, você deve estar familiarizado com os diferentes tipos de animação fornecidos pelo WPF. Para mais informações, consulteVisão geral sobre animações de/para/por, Visão geral de animações de Quadro-Chave e Visão Geral de Animações de Caminho.
Porque as classes de animação herdam da classe Freezable, você deve conhecer os objetos Freezable e como herdar de Freezable. Para obter mais informações, consulte o Visão geral sobre objetos Freezable.
Estendendo o Sistema de Animação
Há diversas formas de estender o sistema de animação de WPF, dependendo do nível de funcionalidade embutida que você quer utilizar. Há três pontos principais de extensibilidade na máquina de animação do WPF:
Crie um objeto de quadro-chave personalizado herdando de uma das classes *<Type>*KeyFrame, tal como DoubleKeyFrame. Esta abordagem utiliza a maior parte da funcionalidade embutida da máquina de animação do WPF.
Crie sua própria classe de animação para herdar de AnimationTimeline ou de uma cas classes *<Type>*AnimationBase.
Utilize callback por quadro para gerar animações quadro a quadro. Esta abordagem contorna completamente os sistemas de animação e de temporização.
A tabela a seguir descreve alguns dos cenários para estender o sistema de animação.
Quando você quiser... |
Utilize esta abordagem |
---|---|
Personalizar a interpolação entre valores de um tipo que tem um <Type>AnimationUsingKeyFrames correspondente. |
Crie um quadro-chave personalizado. Para mais informações, veja a seção Create a Custom Key Frame. |
Personalizar mais do que apenas a interpolação entre valores de um tipo que tem um <Type>Animation correspondente. |
Crie uma classe de animação personalizada que herda da classe <Type>AnimationBase que corresponde ao tipo que você deseja animar. Para mais informações, veja a seção Create a Custom Animation Class. |
Animar um tipo que não tem animação correspondente no WPF. |
Utilize um ObjectAnimationUsingKeyFrames ou crie uma classe que herda de AnimationTimeline. Para mais informações, veja a seção Create a Custom Animation Class. |
Animar múltiplos objetos com valores que são computados a cada quadro e baseados no último conjunto de interações de objetos. |
Utilize callback por quadro. Para mais informações, veja a seção Create and Use Per-Frame Callback. |
Crie um Quadro-Chave Personalizado
Criar uma classe de quadro chave personalizada é a forma mais simples de estender o sistema de animação. Utilize esta abordagem quando você quer um método de interpolação diferente para uma animação key-frame. Como descrito em Visão geral de animações de Quadro-Chave, uma animação key-frame utiliza objetos de quadro chave para gerar seus valores de saída. Cada objeto de quadro chave realiza três funções:
Especifica um valor alvo utilizando a propriedade Value.
Especifica o tempo em que o valor deve ser alcançado utilizando sua propriedade KeyTime.
Interpola entre o valor do quadro chave anterior e seu próprio valor implementando o método InterpolateValueCore.
Instruções de Implementação
Deriva da classe abstrata *<Type>*KeyFrame e implementa o método InterpolateValueCore. O método InterpolateValueCore retorna o valor atual do quadro chave. Ele usa dois parâmetros: o valor do quadro-chave anterior e um valor de progresso que varia de 0 a 1. Uma progresso de 0 indica o quadro-chave começou, e um valor 1 indica que o quadro-chave foi concluída apenas e deve retornar o valor especificado pelo seu Value propriedade.
Porque as classes *<Type>*KeyFrame herdam da classe Freezable, você também deve sobrepor CreateInstanceCore para retornar uma nova instância da sua classe. Se a classe não utiliza propriedades de dependência para armazenar seus dados ou requer inicialização extra após a criação, você pode querer sobrepor métodos adicionais; veja Visão geral sobre objetos Freezable para mais informações.
Após ter criado sua animação personalizada *<Type>*KeyFrame, você pode utilizar com o *<Type>*AnimationUsingKeyFrames para aquele tipo.
Criar uma Classe de Animação Personalizada
Criando seu próprio tipo de animação lhe dá mais controle sobre como um objeto é animado. Há duas maneiras recomendadas para criar seu próprio tipo de animação: Você pode derivar a partir de AnimationTimeline classe ou o *<type>*Classe AnimationBase. Derivando das classes *<Type>*Animation ou *<Type>*AnimationUsingKeyFrames não é recomendado.
Deriva do <Type>AnimationBase
Derivando de uma classe *<Type>*AnimationBase é a forma mais simples de criar um novo tipo de animação. Utilize essa abordagem quando você quiser criar uma animação nova para o tipo que já tem uma classe <Type> AnimationBase correspondente.
Instruções de Implementação
Deriva da classe abstrata *<Type>*Animation e implementa o método GetCurrentValueCore. O método GetCurrentValueCore retorna o valor atual da animação. Ele usa três parâmetros: um valor de partida sugerido, um valor final sugerido e um AnimationClock, que você usa para determinar o progresso da animação.
Porque as classes *<Type>*AnimationBase herdam da classe Freezable, você também deve sobrepor CreateInstanceCore para retornar uma nova instância da sua classe. Se a classe não utiliza propriedades de dependência para armazenar seus dados ou requer inicialização extra após a criação, você pode querer sobrepor métodos adicionais; veja Visão geral sobre objetos Freezable para mais informações.
Para mais informações, veja a documentação do método GetCurrentValueCore para a classe *<Type>*AnimationBase para o tipo que você quer animar. Para um exemplo, veja Personalizar Animação exemplo.
Abordagens Alternativas
Se você simplesmente quer mudar como os valores de animação são interpolados, considere derivar de uma das classes de *<Type>*KeyFrame. O quadro chave que você cria pode ser utilizado com o *<Type>*AnimationUsingKeyFrames correspondente fornecido pelo WPF.
Derive de AnimationTimeline
Derive da classe AnimationTimeline quando você quer criar uma animação para um tipo que ainda não tenha uma animação WPF correspondente, ou quando você quer criar uma animação que não seja fortemente tipada.
Instruções de Implementação
Derive de uma classe AnimationTimeline e sobreponha os seguinte membros:
CreateInstanceCore -- Se sua nova classe é concreta, você deve sobrepor CreateInstanceCore para retornar uma nova instância da sua classe.
GetCurrentValue -- Sobreponha este método para retornar o valor atual da sua animação. Ele usa três parâmetros: um valor de origem do padrão, um valor de destino padrão e um AnimationClock. Utilize o AnimationClock para obter o tempo atual ou o progresso da animação. Você pode escolher se vai utilizar os valores defaults de início e fim.
IsDestinationDefault -- Sobreponha esta propriedade para indicar se sua animação utiliza o valor default final especificado pelo método GetCurrentValue.
TargetPropertyType -- Sobreponha esta propriedade para indicar o Type de saída que sua animação produz.
Se a classe não utiliza propriedades de dependência para armazenar seus dados ou requer inicialização extra após a criação, você pode querer sobrepor métodos adicionais; veja Visão geral sobre objetos Freezable para mais informações.
O paradigma recomendado (utilizado por animações do WPF) é utilizar dois níveis de herança:
Crie uma classe abstrata *<Type>*AnimationBase que deriva de AnimationTimeline. Esta classe deve sobrepor o método TargetPropertyType. Ele também deve introduzir um novo método abstrato, GetCurrentValueCore, e sobrepor GetCurrentValue para que valide os tipos de valores defaults de início e fim, então chama GetCurrentValueCore.
Crie uma nova classe que herda da sua classe *<Type>*AnimationBase e sobreponha o método CreateInstanceCore, o método GetCurrentValueCore que você introduziu, e a propriedade IsDestinationDefault.
Abordagens Alternativas
Se você quer animar um tipo que não tem animação correspondente De/Para/Por ou animação key-frame, considere utilizar um ObjectAnimationUsingKeyFrames. Porque é fracamente tipado, um ObjectAnimationUsingKeyFrames pode animar qualquer tipo de valor. A desvantagem dessa abordagem é que ObjectAnimationUsingKeyFrames somente suporta interpolação discreta.
Utilize callback por quadro (per frame)
Utilize esta abordagem quando você precisar contornar completamente o sistema de animação do WPF. Um cenário para essa abordagem são animações de física, onde 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
Diferente das outras abordagens descritas nesta visão geral, para utilizar callback por quadro você não precisa criar uma classe de animação personalizada ou de key frame.
Em vez disso, você registra para o evento Rendering do objeto que contém o objeto que você quer animar. O método manipulador de evento é chamado uma vez por quadro. Cada vez que o WPF realizar marshaling de dados de renderização persistidos na árvore visual pela árvore de composição, seu método manipulador de evento é chamado.
Em seu manipulador de evento, realize todos os cálculos necessários para seu efeito de animação e defina as propriedades dos objetos que você quer animar com esses valores.
Para obter o tempo de apresentação do quadro atual, o EventArgs associado com esse evento pode er convertido em RenderingEventArgs, que fornece uma propriedade RenderingTime que você pode utilizar para obter o tempo de renderização do quadro atual.
Para mais informações, consulte a página Rendering. Para um exemplo, veja Exemplo de animação por quadro.
Consulte também
Tarefas
Exemplo de animação por quadro
Conceitos
Visão geral de técnicas de animação de propriedades
Visão geral sobre objetos Freezable
Visão geral sobre animações de/para/por
Visão geral de animações de Quadro-Chave
Visão Geral de Animações de Caminho
Visão Geral de Animação e Sistema de Tempo