Información general sobre sistemas de temporización y animación
Actualización: noviembre 2007
En este tema se describe cómo el sistema del control de tiempo utiliza las clases de animación, Timeline y Clock para animar propiedades.
Requisitos previos
Para entender este tema, debe poder utilizar animaciones WPF para animar propiedades, como se describe en Información general sobre animaciones. También ayuda conocer las propiedades de dependencia; para obtener más información, vea Información general sobre las propiedades de dependencia.
Escalas de tiempo y relojes
En Información general sobre animaciones se describía cómo un objeto Timeline representa un segmento de tiempo, y cómo una animación es un tipo de objeto Timeline que produce valores de salida. Por sí mismo, un objeto Timeline, no hace nada más que describir un segmento de tiempo. Es el objeto Clock de la escala de tiempo el que hace el trabajo real. Igualmente, la animación realmente no anima las propiedades: una clase de animación describe cómo se deben calcular los valores de salida, pero es el objeto Clock creado para la animación el que controla el resultado de la animación y lo aplica a las propiedades.
Un objeto Clock es un tipo especial de objeto que mantiene el estado de tiempo de ejecución relacionado con el control de tiempo para el objeto Timeline. Proporciona tres bits de información que son esenciales a la animación y el sistema de control de tiempo: CurrentTime, CurrentProgress y CurrentState. Un objeto Clock determina la hora actual, el progreso y el estado utilizando los comportamientos de control de tiempo descritos por Timeline: Duration, RepeatBehavior, AutoReverse, etc.
En la mayoría de los casos, se crea automáticamente un objeto Clock para la escala de tiempo. Al animar utilizando un objeto Storyboard o el método BeginAnimation, se crean automáticamente relojes para las escalas de tiempo y las animaciones, y se aplican a sus propiedades concretas. También se puede crear un objeto Clock explícitamente usando el método CreateClock del objeto Timeline. El método MediaTimeline.CreateClock crea un reloj del tipo adecuado para el objeto Timeline en el que se llama. Si el objeto Timeline contiene escalas de tiempo secundarias, también crea objetos Clock para ellas. Los objetos Clock resultantes se organizan en árboles que coinciden con la estructura del árbol de objetos Timeline a partir del cual se crean.
Hay diferentes tipos de relojes para diferentes tipos de escalas de tiempo. La tabla siguiente muestra los tipos de Clock que corresponden a algunos de los diferentes tipos de Timeline.
Tipo de escala de tiempo |
Tipo de reloj |
Propósito del reloj |
---|---|---|
Animación (hereda de AnimationTimeline) |
Genera valores de salida para una propiedad de dependencia. |
|
Procesa un archivo multimedia. |
||
Agrupa y controla sus objetos Clock secundarios |
||
Agrupa y controla sus objetos Clock secundarios |
Puede aplicar cualquier objeto AnimationClock que cree a las propiedades de dependencia compatibles utilizando el método ApplyAnimationClock.
En los escenarios de rendimiento intensivo, tales como la animación de grandes números de objetos similares, la administración del uso del propio objeto Clock puede proporcionar ventajas de rendimiento.
Los relojes y el administrador de tiempo
Al animar los objetos en WPF, es el administrador de tiempo el que administra los objetos Clock creados para las escalas de tiempo. El administrador de tiempo es la raíz de un árbol de objetos Clock y controla el flujo de tiempo en ese árbol. El administrador de tiempo se crea automáticamente para cada aplicación WPF y no es visible para el programador de aplicaciones. El administrador de tiempo "marca pasos" muchas veces por segundo; el número real de pasos que se producen cada segundo varía, en función de los recursos disponibles en el sistema. Durante cada uno de estos pasos, el administrador de tiempo calcula el estado de todos los objetos ActiveClockdel árbol de control de tiempo.
En la ilustración siguiente se muestra la relación entre el administrador de tiempo, AnimationClock y una propiedad de dependencia animada.
Animar una propiedad
Cuando el administrador horario marca un paso, actualiza el tiempo de cada objeto Clock Active de la aplicación. Si el objeto Clock es un objeto AnimationClock, utiliza el método GetCurrentValue del objeto AnimationTimeline a partir del que fue creado para calcular su valor de salida actual. El objeto AnimationClock proporciona al objeto AnimationTimeline la hora local actual, un valor de entrada, que es normalmente el valor base de la propiedad, y un valor de destino predeterminado. Al recuperar el valor de un elemento animado por propiedad utilizando el método GetValue o su descriptor de acceso CLR, se obtiene el resultado de su objeto AnimationClock.
Grupos de relojes
En la sección anterior se describió cómo hay diferentes tipos de objetos Clock para los diferentes tipos de escala de tiempo. En la ilustración siguiente se muestra la relación entre el administrador de tiempo, un objeto ClockGroup, un objeto AnimationClock y una propiedad de dependencia animada. Un objeto ClockGroup se crea para las escalas de tiempo que agrupan otras escalas de tiempo, tales como la clase Storyboard, que agrupa animaciones y otras escalas de tiempo.
Un objeto ClockGroup
Composición
Es posible asociar varios relojes a una única propiedad, en cuyo caso cada reloj utiliza el valor de salida del reloj anterior como su valor base. En la ilustración siguiente se muestran tres objetos AnimationClock aplicados a la misma propiedad. El reloj1 utiliza el valor base de la propiedad animada como entrada y lo utiliza para generar el resultado. El reloj2 toma el resultado del reloj1 como entrada y lo utiliza para generar el resultado. El reloj3 toma el resultado del reloj2 como entrada y lo utiliza para generar el resultado. Cuando varios relojes afectan simultáneamente a la misma propiedad, se dice que están en una cadena de composición.
Una cadena de composición
Tenga en cuenta que, aunque se crea una relación entre la entrada y la salida de los objetos AnimationClock de la cadena de composición, sus comportamientos de control de tiempo no se ven afectados; los objetos Clock (incluidos los objetos AnimationClock) tienen una dependencia jerárquica de sus objetos Clock primarios.
Para aplicar varios relojes a la misma propiedad, utilice el miembro Compose de HandoffBehavior cuando aplique una animación de Storyboard, o un objeto AnimationClock.
Pasos y consolidación de eventos
Además de calcular valores de salida, el administrador de tiempo hace otras cosas a cada paso que marca: determina el estado de cada reloj y provoca los eventos adecuados.
Aunque los pasos se producen con frecuencia, pueden ocurrir muchas cosas entre pasos. Por ejemplo, un objeto Clock se puede detener, iniciarse y detenerse de nuevo, en cuyo caso sus valores CurrentState habrán cambiado tres veces. En teoría, el evento CurrentStateInvalidated se podría provocarse varias veces en un único paso; sin embargo, el motor de control de tiempo consolida los eventos, para que el evento CurrentStateInvalidated pueda provocarse como máximo una vez por paso. Esto es verdadero para todos los eventos de control de tiempo: como máximo se provoca un evento de cada tipo para un objeto Clock determinado.
Cuando un objeto Clock cambia de estado y vuelve a su estado original entre pasos (por ejemplo al cambiar de Active a Stopped y de nuevo a Active), el evento asociado continúa produciéndose.
(Para obtener más información acerca de los eventos de control de tiempo, vea Información general sobre eventos de control de tiempo.)
Valores actuales y valores base de propiedades
Una propiedad que se pueda animar puede tener dos valores: un valor base y un valor actual. Al establecer propiedades mediante su descriptor de acceso CLR o el método SetValue, se establece su valor base. Cuando no se anima una propiedad, su valor base y su valor actual son el mismo.
Cuando se anima una propiedad, el objeto AnimationClock establece el valor actual de la propiedad. Al recuperar el valor de la propiedad a través de su descriptor de acceso CLR o del método GetValue se devuelve el resultado del objeto AnimationClock cuando el objeto AnimationClock es Active o Filling. Puede recuperar el valor base de la propiedad utilizando el método GetAnimationBaseValue.
Vea también
Conceptos
Información general sobre animaciones
Información general sobre eventos de control de tiempo
Información general sobre comportamientos de control de tiempo