Visão geral de animações personalizadas

Este tópico descreve como e quando estender o sistema de animação WPF criando quadros-chave personalizados, classes de animação ou usando retorno de chamada por quadro para ignorá-lo.

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 Visão geral sobre animações de From/To/By a visão geral de animações de quadro-chavee o 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 congeláveis.

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 maior parte da funcionalidade interna do mecanismo de animação WPF.

  • Crie sua própria classe de animação herdando de AnimationTimeline ou uma das classes *Type>*<AnimationBase.

  • Use o callback por quadro para gerar animações por quadro. Essa abordagem ignora completamente a animação e o sistema de tempo.

A tabela a seguir descreve alguns dos cenários para estender o sistema de animação.

Quando você quiser... Use essa abordagem
Personalizar a interpolação entre valores de um tipo que tenha um *Type>*<AnimationUsingKeyFrames correspondente Criar um quadro-chave personalizado. Para obter mais informações, consulte a seção Criar um quadro de chave personalizada.
Personalize mais do que apenas a interpolação entre valores de um tipo que tenha uma *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 obter mais informações, consulte a seção Criar uma classe de animação personalizada.
Animar um tipo que não tenha animação WPF correspondente Use um ObjectAnimationUsingKeyFrames ou crie uma classe que herda do AnimationTimeline. Para obter mais informações, consulte a seção Criar uma classe de animação personalizada.
Animar múltiplos objetos com valores que são computados a cada quadro e baseados no último conjunto de interações de objetos Retorno de chamada de quadro de animação. Para obter mais informações, consulte a seção Criar um retorno de chamada do uso por quadro.

Criar um quadro-chave personalizado

Criar uma classe de quadro-chave personalizado é a maneira mais simples para estender o sistema de animação. Use essa abordagem para um método de interpolação diferente para uma animação de quadro-chave. Conforme descrito na Visão geral de animações de quadro-chave, uma animação de quadro-chave 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 de destino usando sua Value propriedade.

  • Especifica o momento em que esse valor deve ser atingido 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. Ele usa 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, você também deve substituir CreateInstanceCore o Freezable núcleo para retornar uma nova instância da classe. Se a classe não usar propriedades de dependência para armazenar seus dados ou requer inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; Consulte a Visão geral de objetos congeláveis para obter mais informações.

Depois de criar sua animação *Type*KeyFrame personalizada, você pode usá-la com *Type>>*<<AnimationUsingKeyFrames para esse tipo.

Criar uma classe de animação personalizada

Criando sua própria animação tipo lhe dá que 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.

Derivar do <tipo>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 método GetCurrentValueCore 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 classe, você também deve substituir CreateInstanceCore o Freezable núcleo para retornar uma nova instância da classe. Se a classe não usar propriedades de dependência para armazenar seus dados ou requer inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; Consulte a Visão geral de objetos congeláveis 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 a Exemplo de animação personalizada

Abordagens alternativas

Se você simplesmente quiser alterar como os valores de animação são interpolados, considerando 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 AnimationTimeline classe quando quiser criar uma animação para um tipo que ainda não tenha uma animação WPF correspondente ou quando quiser criar uma animação que não seja fortemente digitada.

Instruções de implementação

Derive da classe e substitua AnimationTimeline os seguintes membros:

  • CreateInstanceCore – Se sua nova classe for concreta, você deve substituir CreateInstanceCore para retornar uma nova instância de sua classe.

  • GetCurrentValue – Substitua esse método para retornar o valor atual da sua animação. Ele usa três parâmetros: um valor de origem padrão, um valor de destino padrão e um AnimationClockarquivo . Use o para obter a hora atual ou o AnimationClock progresso da animação. Você pode optar por usar os valores padrão de origem e destino.

  • IsDestinationDefault – Substitua GetCurrentValue essa propriedade para indicar se sua animação usa o valor de destino padrão especificado pelo método.

  • TargetPropertyType – Substitua essa propriedade para indicar a Type saída que sua animação produz.

Se a classe não usar propriedades de dependência para armazenar seus dados ou requer inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; Consulte a Visão geral de objetos congeláveis para obter mais informações.

O paradigma recomendado (usado por animações WPF) é usar dois níveis de herança:

  1. Crie uma classe abstrata *Type>*<AnimationBase que deriva de AnimationTimeline. Essa classe deve substituir o TargetPropertyType método. Ele também deve introduzir um novo método abstrato, GetCurrentValueCore, e substituir GetCurrentValue para que ele valide os tipos do valor de origem padrão e parâmetros de valor de destino padrão e, em seguida, chama GetCurrentValueCore.

  2. Crie outra classe que herda de sua nova classe *Type>*<AnimationBase e substitui o método, o CreateInstanceCore método GetCurrentValueCore que você introduziu e a IsDestinationDefault propriedade.

Abordagens alternativas

Se você quiser animar um tipo que não tenha animação De/Para/Por correspondente ou animação de quadro-chave, considere usar um ObjectAnimationUsingKeyFramesarquivo . Por ser fracamente digitado, um ObjectAnimationUsingKeyFrames pode animar qualquer tipo de valor. A desvantagem dessa abordagem é que ObjectAnimationUsingKeyFrames só suporta interpolação discreta.

Utilize Chamada por quadro

Use essa abordagem quando precisar ignorar completamente o sistema de animação WPF. Um cenário para essa abordagem é animações de física, na qual em cada animação etapa que 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

Diferentemente de outras abordagens descritas nesta visão geral, para utilizar callback por quadro você não precisa criar uma classe de quadro-chave ou animação personalizada.

Em vez disso, você se registra para o Rendering evento do objeto que contém os objetos que deseja animar. Esse método de manipulador de eventos é chamado uma vez por quadro. Cada vez que o WPF marshals os dados de renderização persistentes na árvore visual para a árvore de composição, seu método de manipulador de eventos é chamado.

Em seu manipulador de evento, realize todos cálculos necessários para a animação em vigor e definir as propriedades dos objetos que você deseja animar com esses valores.

Para obter o tempo de apresentação do quadro atual, o associado a esse evento pode ser convertido como RenderingEventArgs, que fornece uma RenderingTime propriedade que você pode usar para obter o EventArgs tempo de renderização do quadro atual.

Para obter mais informações, consulte a Rendering página.

Confira também