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

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

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

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

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

Группы часов

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

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

Композиция

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

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

Обратите внимание, что несмотря на то, что связь создается между входом и выходом 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 метода.

См. также раздел