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

Обновлен: Ноябрь 2007

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

Обязательные условия

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

Шкала времени и часы

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

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

В большинстве случаев Clock создается автоматически для шкалы времени. При выполнении анимации с использованием объекта Storyboard или метода BeginAnimation для шкалы времени и анимации автоматически создаются часы, которые затем применяется к их целевым свойствам. Можно также создать Clock явным образом с помощью метода CreateClockTimeline. Метод 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 и является невидимым для разработчиков приложений. Диспетчер времени «тикает» много раз в секунду; фактическое число квантов, возникающих каждую секунду, варьируется в зависимости доступных ресурсов системы. Во время каждого из этих квантов времени диспетчер времени вычисляет состояние всех объектов Active Clock в дереве расчета времени.

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

Анимирование свойства
компоненты временной системы

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

Группы часов

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

ClockGroup
компоненты временной системы

Композиция

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

Цепочка композиции
компоненты временной системы

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

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

Объединение квантов времени и событий

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

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

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

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

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

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

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

См. также

Основные понятия

Общие сведения об эффектах анимации

Общие сведения о временных событиях

Общие сведения о характере поведения во времени