Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe cuándo y cómo ampliar el sistema de animación de WPF mediante la creación de fotogramas clave personalizados, clases de animación, o mediante callbacks por fotograma para omitirlo.
Prerrequisitos
Para comprender este tema, debe estar familiarizado con los diferentes tipos de animaciones proporcionados por WPF. Para obtener más información, vea Información general sobre animaciones de Desde/Hacia/Por, Información general sobre animaciones deKey-Frame y Información general sobre animaciones de trayectoria.
Dado que las clases de animación heredan de la clase Freezable, debe estar familiarizado con los objetos Freezable y cómo heredar de Freezable. Para obtener más información, vea La información general sobre los objetos freezable.
Extender el sistema de animación
Hay varias maneras de ampliar el sistema de animación de WPF, en función del nivel de funcionalidad integrada que quiera usar. Hay tres puntos de extensibilidad principales en el motor de animación de WPF:
Cree un objeto de fotograma clave personalizado heredando de una de las clases *<Type>*KeyFrame, como DoubleKeyFrame. Este enfoque usa la mayor parte de la funcionalidad integrada del motor de animación de WPF.
Cree su propia clase de animación heredando de AnimationTimeline o una de las clases *<Type>*AnimationBase.
Utiliza el callback de cada fotograma para generar animaciones en cada fotograma. Este enfoque omite completamente la animación y el sistema de control de tiempo.
En la tabla siguiente se describen algunos de los escenarios para extender el sistema de animación.
Cuando quieras... | Uso de este enfoque |
---|---|
Personalice la interpolación entre valores de un tipo que tiene una *<Type>*AnimationUsingKeyFrames correspondiente. | Cree un fotograma clave personalizado. Para obtener más información, consulte la sección Crear un fotograma clave personalizado . |
Personalice más que la interpolación entre valores de un tipo que tenga una animación *<Tipo>* correspondiente. | Cree una clase de animación personalizada que herede de la clase *<Type>*AnimationBase que corresponda al tipo que desea animar. Para obtener más información, vea la sección Crear una clase de animación personalizada . |
Animar un tipo que no tenga ninguna animación WPF correspondiente | Use o cree una ObjectAnimationUsingKeyFrames clase que herede de AnimationTimeline. Para obtener más información, vea la sección Crear una clase de animación personalizada . |
Animar varios objetos con valores calculados en cada fotograma y que se basan en las últimas interacciones de objetos. | Utilice el callback en cada fotograma. Para obtener más información, consulte la sección Crear un Callback de Uso Per-Frame. |
Crear un fotograma clave personalizado
La creación de una clase de fotograma clave personalizada es la manera más sencilla de ampliar el sistema de animación. Use este enfoque cuando desee un método de interpolación diferente para una animación de fotograma clave. Como se describe en la Key-Frame Información General de Animaciones, una animación de fotograma clave utiliza objetos clave para generar sus valores de salida. Cada objeto de fotograma clave realiza tres funciones:
Especifica un valor de destino mediante su Value propiedad .
Especifica la hora en la que se debe alcanzar ese valor mediante su KeyTime propiedad .
Interpola entre el valor del fotograma clave anterior y su propio valor mediante la implementación del método InterpolateValueCore.
Instrucciones de implementación
Derive de la clase abstracta *<Type>*KeyFrame e implemente el método InterpolateValueCore. El método InterpolateValueCore devuelve el valor actual del fotograma clave. Toma dos parámetros: el valor del fotograma clave anterior y un valor de progreso que oscila entre 0 y 1. Un progreso de 0 indica que el fotograma clave acaba de iniciarse y un valor de 1 indica que el fotograma clave acaba de completarse y debe devolver el valor especificado por su Value propiedad.
Dado que las clases *<Type>*KeyFrame heredan de la clase Freezable, también debe sobrescribir el núcleo CreateInstanceCore para devolver una nueva instancia de su clase. Si la clase no usa propiedades de dependencia para almacenar sus datos o requiere una inicialización adicional después de la creación, es posible que tenga que invalidar métodos adicionales; consulte La información general sobre los objetos freezable para obtener más información.
Después de crear la animación personalizada *<Type>*KeyFrame, puede usarla con *<Type>*AnimationUsingKeyFrames para ese tipo.
Crear una clase de animación personalizada
La creación de su propio tipo de animación le proporciona más control sobre cómo un objeto está animado. Hay dos maneras recomendadas de crear su propio tipo de animación: puede derivar de la AnimationTimeline clase o la clase *<Type>*AnimationBase. No se recomienda derivar de las clases *<Type>*Animation o *<Type>*AnimationUsingKeyFrames.
Derivar de <Type>AnimationBase
Derivar de una clase *<Type>*AnimationBase es la manera más sencilla de crear un nuevo tipo de animación. Use este enfoque cuando desee crear una nueva animación para el tipo que ya tiene una clase *<Type>*AnimationBase correspondiente.
Instrucciones de implementación
Derive de una clase *<Type>*Animation e implemente el método GetCurrentValueCore. El método GetCurrentValueCore devuelve el valor actual de la animación. Toma tres parámetros: un valor inicial sugerido, un valor final sugerido y un AnimationClock, que se usa para determinar el progreso de la animación.
Dado que las clases *<Type>*AnimationBase heredan de la clase Freezable, también debe sobrescribir CreateInstanceCore el núcleo para devolver una nueva instancia de su clase. Si la clase no usa propiedades de dependencia para almacenar sus datos o requiere una inicialización adicional después de la creación, es posible que tenga que invalidar métodos adicionales; consulte La información general sobre los objetos freezable para obtener más información.
Para obtener más información, vea la documentación del método GetCurrentValueCore para la clase *<Type>*AnimationBase para el tipo que desea animar. Para obtener un ejemplo, consulte el ejemplo de animación personalizada.
Enfoques alternativos
Si simplemente desea cambiar cómo se interpolan los valores de animación, considere la posibilidad de derivar de una de las clases *<Type>*KeyFrame. El fotograma clave que crea se puede usar con los *<Type>*AnimationUsingKeyFrames correspondientes proporcionados por WPF.
Derivado de AnimationTimeline
Derive de la AnimationTimeline clase cuando desee crear una animación para un tipo que no tenga ya una animación WPF correspondiente, o quiera crear una animación que no esté fuertemente tipada.
Instrucciones de implementación
Derive de la AnimationTimeline clase e invalide los miembros siguientes:
CreateInstanceCore – Si su nueva clase es concreta, debe sobrescribir CreateInstanceCore para devolver una nueva instancia de su clase.
GetCurrentValue : invalida este método para devolver el valor actual de la animación. Toma tres parámetros: un valor de origen predeterminado, un valor de destino predeterminado y un AnimationClock. Utiliza AnimationClock para obtener la hora o el progreso actuales de la animación. Puede elegir si se van a usar los valores predeterminados de origen y destino.
IsDestinationDefault : invalida esta propiedad para indicar si la animación usa el valor de destino predeterminado especificado por el GetCurrentValue método .
TargetPropertyType : invalida esta propiedad para indicar la Type salida que genera la animación.
Si la clase no usa propiedades de dependencia para almacenar sus datos o requiere una inicialización adicional después de la creación, es posible que tenga que invalidar métodos adicionales; consulte La información general sobre los objetos freezable para obtener más información.
El paradigma recomendado (usado por animaciones de WPF) es usar dos niveles de herencia:
Cree una clase abstracta *<Type>*AnimationBase que herede de AnimationTimeline. Esta clase debe invalidar el TargetPropertyType método . También debe introducir un nuevo método abstracto, GetCurrentValueCore e invalidar GetCurrentValue para que valide los tipos del valor de origen predeterminado y los parámetros de valor de destino predeterminados y, a continuación, llama a GetCurrentValueCore.
Cree otra clase que herede de la nueva clase *<Type>*AnimationBase e invalide el CreateInstanceCore método, el método GetCurrentValueCore que introdujo y la IsDestinationDefault propiedad .
Enfoques alternativos
Si desea animar un tipo que no tenga ninguna animación From/To/By correspondiente o animación de fotograma clave, considere usar un ObjectAnimationUsingKeyFrames. Dado que está débilmente tipado, un ObjectAnimationUsingKeyFrames puede animar cualquier tipo de valor. El inconveniente de este enfoque es que ObjectAnimationUsingKeyFrames solo admite interpolación discreta.
Uso de Per-Frame Callback
Use este enfoque cuando necesite omitir completamente el sistema de animación wpf. Un escenario para este enfoque es animaciones físicas, donde en cada paso de animación es necesario volver a calcular una nueva dirección o posición de los objetos animados en función del último conjunto de interacciones de objetos.
Instrucciones de implementación
A diferencia de los otros enfoques descritos en esta introducción, para usar la devolución de llamada por fotograma no es necesario crear una animación personalizada ni una clase de fotograma clave.
En su lugar, te registras en el evento Rendering del objeto que contiene los objetos que deseas animar. Este método de controlador de eventos se llama una vez por fotograma. Cada vez que WPF organiza los datos de representación persistentes del árbol visual hacia el árbol de composición, se llama a su método controlador de eventos.
En el controlador de eventos, realice los cálculos necesarios para el efecto de animación y establezca las propiedades de los objetos que desea animar con estos valores.
Para obtener la hora de presentación del fotograma actual, el EventArgs asociado a este evento se puede convertir como RenderingEventArgs, que proporciona una RenderingTime propiedad que puede usar para obtener el tiempo de representación del fotograma actual.
Para obtener más información, consulte la Rendering página.
Consulte también
- AnimationTimeline
- IKeyFrame
- Introducción a las técnicas de animación de propiedades
- Introducción a los objetos Freezable
- Información general sobre animaciones deKey-Frame
- Resumen de animaciones de trayectoria
- Visión general de animación
- Información general del sistema de animación y control de tiempo
- Ejemplo de animación personalizada
.NET Desktop feedback