Общие сведения об анимации и системе управления временем

В этом разделе описывается, как временная система использует средства анимации, а также классы Timeline и Clock для анимации свойств.

Необходимые компоненты

Чтобы понять содержимое этого раздела, необходимо знать, как можно использовать анимацию WPF для анимации свойств, которая описана в разделе Общие сведения об эффектах анимации. В нем также можно ознакомиться со свойствами зависимостей. Дополнительные сведения см. в разделе Общие сведения о свойствах зависимостей.

Временные шкалы и часы

В разделе Общие сведения об эффектах анимации описывается, как объект Timeline представляет сегмент времени, и то, что анимация это объект типа Timeline, который генерирует выходные значения. Сам по себе объект Timeline не делает ничего, просто описывает сегмент времени. Всю основную работу выполняет объект временной шкалы Clock. Также и средства анимации не выполняют фактической анимации свойств. Класс анимации описывает способ расчета выходных значений, а для анимации создается объект Clock, который применяет анимацию к свойствам.

Объект Clock является специализированным и поддерживает для объекта Timeline состояние выполнения с привязкой ко времени. Он предоставляет три единицы информации, существенно важных для анимации и временной системы: CurrentTime, CurrentProgress и CurrentState. Объект Clock определяет текущее время, ход выполнения и состояние с помощью временных диаграмм, которые описываются его свойствами: Timeline,Duration, RepeatBehavior, AutoReverse и т. д.

В большинстве случаев объект Clock создается автоматически для используемой временной шкалы. При выполнении анимации с помощью Storyboard или метода BeginAnimation таймеры создаются автоматически для временных шкал и анимаций и применяются к соответствующим свойствам. Объект Clock можно создать явным образом с помощью метода CreateClock из объекта Timeline. Метод MediaTimeline.CreateClock создает таймер соответствующего типа для объекта Timeline, в котором он вызывается. Если в Timeline содержатся дочерние временные шкалы, для них также создается объекты Clock. Итоговые объекты Clock организуются в виде деревьев, которые соответствуют структуре дерева объектов Timeline, для обеспечения работы которых они созданы.

Существует различных типа часов для различных типов шкал времени. В следующей таблице показаны типы объекта Clock, которые соответствуют нескольким различным типам объекта Timeline.

Тип временной шкалы Тип часов Назначение часов
Анимация (наследуется от AnimationTimeline) AnimationClock Создает выходные значения для свойства зависимостей.
MediaTimeline MediaClock Обрабатывает файл мультимедиа.
ParallelTimeline ClockGroup Группирует свои дочерние объекты Clock и управляет ими
Storyboard ClockGroup Группирует свои дочерние объекты Clock и управляет ими

Любые созданные объекты AnimationClock можно применять для совместимых свойств зависимостей с помощью метода ApplyAnimationClock.

В сценариях с высокой нагрузкой, например при анимации большого количества сходных объектов, управление использованием объекта Clock может повысить производительность.

Часы и диспетчер времени

При анимации объектов в WPF диспетчер времени управляет объектами Clock, созданными для временных шкал. Диспетчер времени — это корень дерева объектов Clock, который управляет потоком времени в этом дереве. Диспетчер времени создается автоматически для каждого приложения WPF и невидим для разработчика приложений. Диспетчер времени "тикает" много раз в секунду; фактическое число тактов, возникающих каждую секунду, зависит от доступных системных ресурсов. В течение каждого из этих тактов диспетчер времени рассчитывает состояние всех объектов ActiveClock в дереве временной шкалы.

На следующем рисунке показана связь между диспетчером времени и AnimationClock, а также анимированными свойствами зависимостей.

Timing system components and the time manager.
Анимирование свойства

При срабатывании на каждом такте диспетчер времени обновляет время каждого объекта ActiveClock в приложении. Если Clock является объектом AnimationClock, тогда используется метод GetCurrentValue объекта AnimationTimeline, из которого он был создан для расчета текущего выходного значения. AnimationClock предоставляет объект AnimationTimeline с текущим локальным временем, входное значение, которое является обычно базовым значением свойства и целевым значением по умолчанию. При получении значения, анимированного свойством посредством метода GetValue или собственного метода доступа CLR, в качестве выходного передается значение собственного объекта AnimationClock.

Группы часов

В предыдущем разделе описаны различные типы объектов Clock для различных типов временных шкал. На следующем рисунке показана связь между диспетчером времени, объектом ClockGroup, объектом AnimationClock и анимированными свойствами зависимостей. Объект ClockGroup создается для временных шкал, которые выполняют группирование других временных шкал, таких как класс Storyboard, который группирует анимации и другие временные шкалы.

Timing system components with the time manager and dependency properties.
ClockGroup

Создание

Можно связать несколько часов с одним свойством. При этом каждые часы используют выходное значение предыдущих часов в качестве своего базового значения. На следующем рисунке показано три объекта AnimationClock, примененных к одному и тому же свойству. Clock1 использует базовое значение анимируемого свойства в качестве входных данных и для создания выходных данных. Clock2 принимает выходные данные от Clock1 в качестве входных данных и использует их для создания выходных данных. Clock3 принимает выходные данные от Clock2 в качестве входных данных и использует их для создания выходных данных. Когда несколько часов влияют на одно и то же свойство одновременно, считается, что они находятся в цепочке композиции.

Timing system components composed with multiple dependency properties.
Цепочка композиции

Обратите внимание, что хотя между входом и выходом объектов AnimationClock в цепочке композиции образована связь, это не влияет на их временные диаграммы; у объектов Clock (включая объекты AnimationClock) имеется иерархическая зависимость от их родительских объектов Clock.

Чтобы применить несколько часов к одному и тому же свойству, используйте вариант ComposeHandoffBehavior в случае применения Storyboard, анимации или AnimationClock.

Такты и объединение событий

В дополнение к расчету выходных значений тикающий диспетчер времени выполняет и другие операции: он определяет состояние всех часов и вызывает соответствующие события.

Хотя такты меняются часто, между ними может возникать множество событий. Например, объект Clock может быть остановлен, запущен и снова остановлен, в этом случае его значение CurrentState будет изменено три раза. Теоретически событие CurrentStateInvalidated может вызываться несколько раз в одном такте. Однако система управления временем объединяет события так, чтобы каждое событие CurrentStateInvalidated могло происходить не более одного раза за такт. Это справедливо для всех временных событий: для заданного объекта Clock может быть вызвано не более одного события каждого типа.

Когда Clock переключает состояния и возвращается обратно в исходное состояние между тактами (например, изменение из состояния Active в состояние Stopped и обратно в Active), связанное событие все еще происходит.

Дополнительные сведения о временных событиях см. в разделе Общие сведения о временных событиях.

Текущие и базовые значения свойств

Анимированное свойство может иметь два значения: базовое значение и текущее. При задании свойства с помощью метода доступа CLR или метода SetValue задается базовое значение свойства. Если свойство не анимировано, его базовое и текущее значения совпадают.

При анимации свойства объект AnimationClock задает текущее значение свойства. При получении значения свойства посредством метода доступа CLR или метода GetValue возвращается вывод объекта AnimationClock, когда объект AnimationClock имеет состояние Active или Filling. Базовое значение свойства можно получить с помощью метода GetAnimationBaseValue.

См. также