Cenni preliminari sulle animazioni personalizzateCustom Animations Overview

Questo argomento descrive come e quando estendere il sistema di animazione WPFWPF creando fotogrammi chiave e classi di animazione personalizzati o usando il callback per frame come alternativa al sistema.This topic describes how and when to extend the WPFWPF animation system by creating custom key frames, animation classes, or by using per-frame callback to bypass it.

PrerequisitiPrerequisites

Per comprendere l'argomento, è necessario conoscere i diversi tipi di animazione offerti da WPFWPF.To understand this topic, you should be familiar with the different types of animations provided by the WPFWPF. Per altre informazioni, vedere Cenni preliminari sulle animazioni From/To/By, Cenni preliminari sulle animazioni con fotogrammi chiave e Panoramica sulle animazioni tracciato.For more information, see the From/To/By Animations Overview, the Key-Frame Animations Overview, and the Path Animations Overview.

Poiché le classi di animazione ereditano il Freezable (classe), è necessario avere familiarità con Freezable oggetti e come ereditare da Freezable.Because the animation classes inherit from the Freezable class, you should be familiar with Freezable objects and how to inherit from Freezable. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.For more information, see the Freezable Objects Overview.

Estensione del sistema di animazioneExtending the Animation System

Esistono diversi modi per estendere il sistema di animazione WPFWPF, a seconda del livello di funzionalità incorporate che si desidera usare.There are a number of ways to extend the WPFWPF animation system, depending on the level of built-in functionality you want to use. Esistono tre punti di estendibilità principali nel motore di animazione WPFWPF:There are three primary extensibility points in the WPFWPF animation engine:

  • Creare un oggetto fotogramma chiave personalizzato ereditando da una del <tipo > classi fotogramma chiave, ad esempio DoubleKeyFrame.Create a custom key frame object by inheriting from one of the <Type> KeyFrame classes, such as DoubleKeyFrame. Questo approccio usa la maggior parte delle funzionalità incorporate del motore di animazione WPFWPF.This approach uses most of the built-in functionality of the WPFWPF animation engine.

  • Creare una classe di animazione ereditando dalla AnimationTimeline o uno del <tipo > classi AnimationBase.Create your own animation class by inheriting from AnimationTimeline or one of the <Type> AnimationBase classes.

  • Usare il callback per frame per generare animazioni per frame.Use per-frame callback to generate animations on a per-frame basis. Questo approccio ignora completamente il sistema di animazione e di intervalli.This approach completely bypasses the animation and timing system.

La tabella seguente descrive alcuni scenari per l'estensione del sistema di animazione.The following table describes some the scenarios for extending the animation system.

Quando si vuole...When you want to... Usare questo approccioUse this approach
Personalizzare l'interpolazione tra valori di un tipo che possiede un <Tipo> AnimationUsingKeyFrames corrispondente.Customize the interpolation between values of a type that has a corresponding <Type> AnimationUsingKeyFrames Creare un fotogramma chiave personalizzato.Create a custom key frame. Per altre informazioni, vedere la sezione Creare un fotogramma chiave personalizzato.For more information, see the Create a Custom Key Frame section.
Non personalizzare solo l'interpolazione tra valori di un tipo che possiede un <Tipo> Animation corrispondente.Customize more than just the interpolation between values of a type that has a corresponding <Type> Animation. Creare una classe di animazione personalizzata che eredita dalla classe <Tipo> AnimationBase che corrisponde al tipo che si desidera animare.Create a custom animation class that inherits from the <Type> AnimationBase class that corresponds to the type you want to animate. Per altre informazioni, vedere la sezione Create a Custom Animation Class (Creare una classe di animazione personalizzata).For more information, see the Create a Custom Animation Class section.
Animare un tipo che non possiede alcuna animazione WPFWPF corrispondente.Animate a type that has no corresponding WPFWPF animation Utilizzare un ObjectAnimationUsingKeyFrames o creare una classe che eredita da AnimationTimeline.Use an ObjectAnimationUsingKeyFrames or create a class that inherits from AnimationTimeline. Per altre informazioni, vedere la sezione Create a Custom Animation Class (Creare una classe di animazione personalizzata).For more information, see the Create a Custom Animation Class section.
Animare più oggetti con valori che vengono calcolati a ogni frame e si basano l'ultimo set di interazioni tra oggetti.Animate multiple objects with values that are computed each frame and are based on the last set of object interactions Usare il callback per frame.Use per-frame callback. Per altre informazioni, vedere la sezione Usare il callback per frame.For more information, see the Create a Use Per-Frame Callback section.

Creare un fotogramma chiave personalizzatoCreate a Custom Key Frame

La creazione di una classe di fotogramma chiave personalizzata rappresenta il modo più semplice per estendere il sistema di animazione.Creating a custom key frame class is the simplest way to extend the animation system. È consigliabile usare questo approccio quando si desidera usare un metodo di interpolazione diverso per un'animazione con fotogrammi chiave.Use this approach when you want to a different interpolation method for a key-frame animation. Come descritto in Cenni preliminari sulle animazioni con fotogrammi chiave, un'animazione con fotogrammi chiave usa oggetti fotogramma chiave per generare i valori di output.As described in the Key-Frame Animations Overview, a key-frame animation uses key frame objects to generate its output values. Ogni oggetto fotogramma chiave esegue tre funzioni:Each key frame object performs three functions:

  • Specifica un valore di destinazione utilizzando il relativo Value proprietà.Specifies a target value using its Value property.

  • Specifica l'ora in cui tale valore deve essere raggiunto tramite il relativo KeyTime proprietà.Specifies the time at which that value should be reached using its KeyTime property.

  • Crea un'interpolazione tra il valore del fotogramma chiave precedente e il proprio valore implementando il metodo InterpolateValueCore.Interpolates between the value of the previous key frame and its own value by implementing the InterpolateValueCore method.

Istruzioni per l'implementazioneImplementation Instructions

Eseguire la derivazione dalla classe astratta <Tipo> KeyFrame e implementare il metodo InterpolateValueCore.Derive from the <Type> KeyFrame abstract class and implement the InterpolateValueCore method. Il metodo InterpolateValueCore restituisce il valore corrente del fotogramma chiave.The InterpolateValueCore method returns the current value of the key frame. Accetta due parametri: il valore del fotogramma chiave precedente e un valore di avanzamento compreso tra 0 e 1.It takes two parameters: the value of the previous key frame and a progress value that ranges from 0 to 1. Un avanzamento pari a 0 indica che ha iniziato il fotogramma chiave e il valore 1 indica che il fotogramma chiave appena completata e deve restituire il valore specificato dal relativo Value proprietà.A progress of 0 indicates the key frame has just started, and a value of 1 indicates that the key frame has just completed and should return the value specified by its Value property.

Poiché il <tipo > KeyFrame eredita dal Freezable (classe), è necessario inoltre eseguire l'override CreateInstanceCore core per restituire una nuova istanza della classe.Because the <Type> KeyFrame classes inherit from the Freezable class, you must also override CreateInstanceCore core to return a new instance of your class. Se la classe non usa le proprietà di dipendenza per archiviare i dati o richiede un'altra inizializzazione dopo la creazione, potrebbe essere necessario eseguire l'override di altri metodi. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.If the class does not use dependency properties to store its data or it requires extra initialization after creation, you might need to override additional methods; see the Freezable Objects Overview for more information.

Dopo aver creato l'animazione <Tipo> KeyFrame personalizzata, è possibile usarla con <Tipo> AnimationUsingKeyFrames per tale tipo.After you've created your custom <Type> KeyFrame animation, you can use it with the <Type> AnimationUsingKeyFrames for that type.

Creare una classe di animazione personalizzataCreate a Custom Animation Class

La creazione di un tipo di animazione personalizzato consente un maggiore controllo sul modo in cui un oggetto viene animato.Creating your own animation type gives you more control over how an object in animated. Esistono due procedure consigliate per creare un nuovo tipo di animazione: è possibile derivare il AnimationTimeline classe o <tipo > personalizzata.There are two recommended ways to create your own animation type: you can derive from the AnimationTimeline class or the <Type> AnimationBase class. La derivazione della classe <Tipo> Animation o <Tipo> AnimationUsingKeyFrames non è consigliata.Deriving from the <Type> Animation or <Type> AnimationUsingKeyFrames classes is not recommended.

Derivazione dalla classe <Tipo>AnimationBaseDerive from <Type>AnimationBase

La derivazione da una classe <Tipo> AnimationBase è il modo più semplice per creare un nuovo tipo di animazione.Deriving from a <Type> AnimationBase class is the simplest way to create a new animation type. Usare questo approccio quando si desidera creare una nuova animazione per il tipo che dispone già di una classe <Tipo> AnimationBase.Use this approach when you want to create a new animation for type that already has a corresponding <Type> AnimationBase class.

Istruzioni per l'implementazioneImplementation Instructions

Eseguire la derivazione di una classe <Tipo> Animation e implementare il metodo GetCurrentValueCore.Derive from a <Type> Animation class and implement the GetCurrentValueCore method. Il metodo GetCurrentValueCore restituisce il valore corrente dell'animazione.The GetCurrentValueCore method returns the current value of the animation. Il metodo accetta tre parametri: un valore iniziale suggerito, un valore finale suggerito e un AnimationClock, che consente di determinare lo stato di avanzamento dell'animazione.It takes three parameters: a suggested starting value, a suggested ending value, and an AnimationClock, which you use to determine the progress of the animation.

Poiché il <tipo > AnimationBase eredita dal Freezable (classe), è necessario inoltre eseguire l'override CreateInstanceCore core per restituire una nuova istanza della classe.Because the <Type> AnimationBase classes inherit from the Freezable class, you must also override CreateInstanceCore core to return a new instance of your class. Se la classe non usa le proprietà di dipendenza per archiviare i dati o richiede un'altra inizializzazione dopo la creazione, potrebbe essere necessario eseguire l'override di altri metodi. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.If the class does not use dependency properties to store its data or it requires extra initialization after creation, you might need to override additional methods; see the Freezable Objects Overview for more information.

Per altri informazioni, vedere la documentazione relativa al metodo GetCurrentValueCore per la classe <Tipo> AnimationBase per il tipo che si desidera animare.For more information, see the GetCurrentValueCore method documentation for the <Type> AnimationBase class for the type that you want to animate. Per un esempio, vedere Esempio di animazione personalizzataFor an example, see the Custom Animation Sample

Approcci alternativiAlternative Approaches

Se si desidera semplicemente modificare il modo in cui i valori dell'animazione vengono interpolati, si prenda in considerazione la derivazione da una delle classi <Tipo> KeyFrame.If you simply want to change how animation values are interpolated, considering deriving from one of the <Type> KeyFrame classes. Il fotogramma chiave creato può essere usato con la classe <Tipo> AnimationUsingKeyFrames corrispondente fornita da WPFWPF.The key frame you create can be used with the corresponding <Type> AnimationUsingKeyFrames provided by WPFWPF.

Derivazione dalla classe AnimationTimelineDerive from AnimationTimeline

Derivare il AnimationTimeline classe quando si desidera creare un'animazione per un tipo che non dispone già di un corrispondente WPFWPF animazione, o si desidera creare un'animazione che non deve essere fortemente tipizzata.Derive from the AnimationTimeline class when you want to create an animation for a type that doesn't already have a matching WPFWPF animation, or you want to create an animation that is not strongly typed.

Istruzioni per l'implementazioneImplementation Instructions

Derivare la AnimationTimeline classe ed eseguire l'override dei membri seguenti:Derive from the AnimationTimeline class and override the following members:

  • CreateInstanceCore : Se la nuova classe è concreta, è necessario eseguire l'override CreateInstanceCore per restituire una nuova istanza della classe.CreateInstanceCore – If your new class is concrete, you must override CreateInstanceCore to return a new instance of your class.

  • GetCurrentValue : Eseguire l'override di questo metodo per restituire il valore corrente dell'animazione.GetCurrentValue – Override this method to return the current value of your animation. Il metodo accetta tre parametri: un valore di origine predefinito, un valore di destinazione predefinito e un AnimationClock.It takes three parameters: a default origin value, a default destination value, and an AnimationClock. Utilizzare il AnimationClock per ottenere l'ora corrente o avanzamento dell'animazione.Use the AnimationClock to obtain the current time or progress for the animation. L'uso dei valori predefiniti di origine e destinazione è facoltativo.You can choose whether to use the default origin and destination values.

  • IsDestinationDefault : Eseguire l'override di questa proprietà per indicare se l'animazione utilizza il valore di destinazione predefinito specificato per il GetCurrentValue metodo.IsDestinationDefault – Override this property to indicate whether your animation uses the default destination value specified by the GetCurrentValue method.

  • TargetPropertyType : Eseguire l'override di questa proprietà per indicare il Type di output prodotto dall'animazione.TargetPropertyType – Override this property to indicate the Type of output your animation produces.

Se la classe non usa le proprietà di dipendenza per archiviare i dati o richiede un'altra inizializzazione dopo la creazione, potrebbe essere necessario eseguire l'override di altri metodi. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.If the class does not use dependency properties to store its data or it requires extra initialization after creation, you might need to override additional methods; see the Freezable Objects Overview for more information.

Il paradigma consigliato (usato dalle animazioni WPFWPF) consiste nell'usare due livelli di ereditarietà:The recommended paradigm (used by WPFWPF animations) is to use two inheritance levels:

  1. Creare una classe astratta <tipo > AnimationBase che deriva da AnimationTimeline.Create an abstract <Type> AnimationBase class that derives from AnimationTimeline. Questa classe deve eseguire l'override di TargetPropertyType metodo.This class should override the TargetPropertyType method. Deve anche introdurre un nuovo metodo astratto, GetCurrentValueCore ed eseguire l'override GetCurrentValue in modo che la convalida dei tipi i parametri di valore di destinazione predefinito e il valore di origine predefinito, quindi chiama GetCurrentValueCore.It should also introduce a new abstract method, GetCurrentValueCore, and override GetCurrentValue so that it validates the types of the default origin value and default destination value parameters, then calls GetCurrentValueCore.

  2. Creare un'altra classe che eredita dalla nuova <tipo > personalizzata ed esegue l'override di CreateInstanceCore (metodo), il metodo GetCurrentValueCore introdotte, e IsDestinationDefault proprietà.Create another class that inherits from your new <Type> AnimationBase class and overrides the CreateInstanceCore method, the GetCurrentValueCore method that you introduced, and the IsDestinationDefault property.

Approcci alternativiAlternative Approaches

Se si desidera aggiungere un'animazione a un tipo che non ha corrispondente a/da animazione o animazione di fotogrammi chiave, è consigliabile utilizzare un ObjectAnimationUsingKeyFrames.If you want to animate a type that has no corresponding From/To/By animation or key-frame animation, consider using an ObjectAnimationUsingKeyFrames. Poiché è scarsamente tipizzato, un ObjectAnimationUsingKeyFrames possibile aggiungere un'animazione a qualsiasi tipo di valore.Because it is weakly typed, an ObjectAnimationUsingKeyFrames can animate any type of value. Lo svantaggio di questo approccio è che ObjectAnimationUsingKeyFrames supporta solo l'interpolazione discreta.The drawback to this approach is that ObjectAnimationUsingKeyFrames only supports discrete interpolation.

Usare il callback per frameUse Per-Frame Callback

Usare questo approccio quando è necessario ignorare completamente il sistema di animazione di WPFWPF.Use this approach when you need to completely bypass the WPFWPF animation system. Uno scenario di questo approccio è rappresentato dalle animazioni fisiche, dove a ciascun passaggio dell'animazione è necessario ricalcolare una nuova direzione o posizione degli oggetti animati in base all'ultima serie di interazioni dell'oggetto.One scenario for this approach is physics animations, where at each animation step a new direction or position of animated objects needs to be recomputed based on the last set of object interactions.

Istruzioni per l'implementazioneImplementation Instructions

A differenza degli altri approcci descritti in questa panoramica, per usare un callback per frame non è necessario creare un'animazione personalizzata o una classe con fotogrammi chiave.Unlike the other approaches described in this overview, to use per-frame callback you don't need to create a custom animation or key frame class.

In alternativa, per registrare il Rendering evento dell'oggetto che contiene gli oggetti a cui si desidera aggiungere un'animazione.Instead, you register for the Rendering event of the object that contains the objects you want to animate. Questo metodo del gestore eventi viene chiamato una volta per ogni fotogramma.This event handler method gets called once per frame. Ogni volta che WPFWPF esegue il marshalling dei dati di rendering salvati in modo permanente nella struttura ad albero visuale sull'albero di composizione, viene chiamato il metodo del gestore eventi.Each time that WPFWPF marshals the persisted rendering data in the visual tree across to the composition tree, your event handler method is called.

Nel gestore eventi eseguire i calcoli necessari per l'effetto di animazione e impostare le proprietà degli oggetti da animare con tali valori.In your event handler, perform your whatever calculations necessary for your animation effect and set the properties of the objects you want to animate with these values.

Per ottenere l'ora di presentazione del frame corrente, il EventArgs associato a questo evento può essere eseguito il cast come RenderingEventArgs, che forniscono un RenderingTime i tempi di rendering della proprietà che è possibile utilizzare per ottenere il frame corrente.To obtain the presentation time of the current frame, the EventArgs associated with this event can be cast as RenderingEventArgs, which provide a RenderingTime property that you can use to obtain the current frame's rendering time.

Per ulteriori informazioni, vedere il Rendering pagina.For more information, see the Rendering page.

Vedere ancheSee Also

AnimationTimeline
IKeyFrame
Cenni preliminari sulle tecniche di animazione delle proprietàProperty Animation Techniques Overview
Cenni preliminari sugli oggetti FreezableFreezable Objects Overview
Cenni preliminari sulle animazioni con fotogrammi chiaveKey-Frame Animations Overview
Panoramica sulle animazioni tracciatoPath Animations Overview
Cenni preliminari sull'animazioneAnimation Overview
Cenni preliminari sull'animazione e sul sistema di temporizzazioneAnimation and Timing System Overview
Esempio di animazione personalizzataCustom Animation Sample