Compartilhar via


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:

  1. 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.

  2. 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

Personalizar Animação exemplo

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

Revisão de Animação

Visão Geral de Animação e Sistema de Tempo

Referência

AnimationTimeline

IKeyFrame