Compartir a través de


Información general del sistema de animación y control de tiempo

En este tema se describe cómo el sistema de control de tiempo usa las clases de animación, Timeline, y Clock para animar propiedades.

Prerrequisitos

Para comprender este tema, debería poder usar animaciones de WPF para animar propiedades, como se describe en Información general de animación. También ayuda a familiarizarse con las propiedades de dependencia; para obtener más información, consulte Introducción a las propiedades de dependencia.

Escalas de tiempo y relojes

La visión general de animación describe cómo Timeline representa un segmento de tiempo, y una animación es un tipo de Timeline que genera valores de salida. Por sí solo, un Timeline, no hace nada más que describir un segmento de tiempo. Es el objeto de la Clock línea de tiempo el que realiza el verdadero trabajo. Del mismo modo, la animación no anima realmente las propiedades: una clase de animación describe cómo se deben calcular los valores de salida, pero es el Clock, creado para la animación, el que controla la salida y la aplica a las propiedades.

Un objeto de tipo especial, Clock, que mantiene el estado de ejecución relacionado con el tiempo para el Timeline. Proporciona tres bits de información que son esenciales para el sistema de animación y control de tiempo: CurrentTime, CurrentProgressy CurrentState. Un Clock determina su tiempo actual, progreso y estado mediante los comportamientos de tiempo descritos por sus Timeline: Duration, RepeatBehavior, AutoReverse, etc.

En la mayoría de los casos, se crea automáticamente un Clock para la escala de tiempo. Cuando animas utilizando un Storyboard o el método BeginAnimation, se crean automáticamente relojes para las líneas de tiempo y las animaciones, aplicándose a sus propiedades de destino. También puede crear un Clock explícitamente mediante el método CreateClock de su Timeline. El método MediaTimeline.CreateClock crea un reloj del tipo adecuado para el Timeline en el que se llama. Si el Timeline contiene escalas de tiempo secundarias, también crea objetos Clock para ellas. Los objetos resultantes Clock se organizan en árboles que coinciden con la estructura del árbol de objetos Timeline desde el cual se crean.

Hay diferentes tipos de relojes para diferentes tipos de escalas de tiempo. En la tabla siguiente se muestran los Clock tipos que corresponden a algunos de los distintos Timeline tipos.

Tipo de línea de tiempo Tipo de reloj Propósito del reloj
Animación (hereda de AnimationTimeline) AnimationClock Genera valores de salida para una propiedad de dependencia.
MediaTimeline MediaClock Procesa un archivo multimedia.
ParallelTimeline ClockGroup Agrupa y controla sus objetos secundarios Clock
Storyboard ClockGroup Agrupa y controla sus objetos secundarios Clock

Puede aplicar cualquier AnimationClock objeto que cree a propiedades de dependencia compatibles mediante el ApplyAnimationClock método .

En escenarios exigentes para el rendimiento, como la animación de grandes cantidades de objetos similares, gestionar el uso de Clock por su cuenta puede proporcionar beneficios en el rendimiento.

Relojes y el Administrador de hora

Al animar objetos en WPF, el administrador de tiempo es el encargado de administrar los objetos creados para las líneas de tiempo Clock. El administrador de hora es la raíz de un árbol de Clock objetos y controla el flujo de tiempo en ese árbol. Se crea automáticamente un administrador de tiempo para cada aplicación WPF y es invisible para el desarrollador de aplicaciones. El administrador de tiempo "ticks" muchas veces por segundo; el número real de ticks que se producen cada segundo varía en función de los recursos disponibles del sistema. Durante cada uno de estos tics, el administrador de tiempo calcula el estado de todos los ActiveClock objetos del árbol de tiempo.

En la ilustración siguiente se muestra la relación entre el administrador de hora y AnimationClock, y una propiedad de dependencia animada.

Componentes del sistema de control de tiempo y el administrador de tiempo.
Animar una propiedad

Cuando el gestor de tiempo funciona, actualiza la hora de cada ActiveClock dentro de la aplicación. Si el Clock es un AnimationClock, utiliza el método GetCurrentValue del AnimationTimeline del que fue creado para calcular su valor de salida actual. AnimationClock proporciona a AnimationTimeline la hora local actual, un valor de entrada, que suele ser el valor base de la propiedad, y un valor de destino predeterminado. Cuando recuperas el valor de una propiedad animada usando el método GetValue o su accesador CLR, obtienes la salida de su AnimationClock.

Grupos de relojes

En la sección anterior se describe cómo hay diferentes tipos de Clock objetos para distintos tipos de escalas de tiempo. En la ilustración siguiente se muestra la relación entre el administrador de tiempo, un ClockGroup, un AnimationClock y una propiedad de dependencia animada. Se crea un ClockGroup para líneas de tiempo que agrupan otras líneas de tiempo, como la clase Storyboard, que agrupa animaciones y otras líneas de tiempo.

Componentes del sistema de control de tiempo con el administrador de tiempo y las propiedades de dependencia.
Un Grupo de Relojes

Composición

Es posible asociar varios relojes a una sola propiedad, en cuyo caso cada reloj usa el valor de salida del reloj anterior como su valor base. En la ilustración siguiente se muestran tres AnimationClock objetos aplicados a la misma propiedad. Clock1 usa el valor base de la propiedad animada como entrada y lo usa para generar la salida. Clock2 toma la salida de Clock1 como entrada y la usa para generar la salida. Clock3 toma la salida de Clock2 como entrada y la usa para generar la salida. Cuando varios relojes afectan a la misma propiedad simultáneamente, se dice que están en una cadena de composición.

Componentes del sistema de control de tiempo compuestos con varias propiedades de dependencia.
Una cadena de composición

Tenga en cuenta que, aunque se crea una relación entre la entrada y la salida de los AnimationClock objetos de la cadena de composición, sus comportamientos de control de tiempo no se ven afectados; Clock los objetos (incluidos AnimationClock los objetos) tienen una dependencia jerárquica de sus objetos primarios Clock .

Para aplicar varios relojes a la misma propiedad, use los elementos ComposeHandoffBehavior al aplicar una Storyboard, una animación o un AnimationClock.

Tics y consolidación de eventos

Además de calcular los valores de salida, el gestor de tiempo realiza otros trabajos cada vez que emite un tic: determina el estado de cada reloj y genera eventos cuando es necesario.

Aunque los ticks se producen con frecuencia, es posible que ocurran muchas cosas entre ticks. Por ejemplo, un Clock se podría detener, iniciar y detener de nuevo, en cuyo caso su CurrentState valor habrá cambiado tres veces. En teoría, el evento CurrentStateInvalidated podría generarse varias veces en un solo tick; sin embargo, el motor de temporización consolida los eventos, de modo que el evento CurrentStateInvalidated se pueda generar como máximo una vez por tick. Esto es cierto para todos los eventos de control de tiempo: se genera como máximo un evento de cada tipo para un objeto determinado Clock .

Cuando un Clock cambia de estado y regresa a su estado original entre ciclos (por ejemplo, cambiar de Active a Stopped y volver a Active), el evento asociado aún ocurre.

Para obtener más información sobre los eventos de temporización, consulte la Descripción general de los eventos de temporización.

Valores actuales y valores base de propiedades

Una propiedad animatable puede tener dos valores: un valor base y un valor actual. Al establecer la propiedad mediante su descriptor de acceso CLR o el SetValue método , se establece su valor base. Cuando una propiedad no está animada, sus valores base y actual son los mismos.

Al animar una propiedad, AnimationClock establece el valor actual de la propiedad. Recuperar el valor de la propiedad a través de su accesor CLR o del método GetValue devuelve la salida de AnimationClock cuando AnimationClock es Active o Filling. Puede recuperar el valor base de la propiedad mediante el GetAnimationBaseValue método .

Consulte también