Поделиться через


Анимация (DirectComposition)

Заметка

Для приложений в Windows 10 рекомендуется использовать API-интерфейсы Windows.UI.Composition вместо DirectComposition. Дополнительные сведения см. в модернизации классического приложения с помощьювизуального слоя.

В этом разделе рассматриваются основы анимации Microsoft DirectComposition. Он содержит следующие разделы:

Что такое анимация?

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

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

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

 

Свойства, которые могут быть анимированы

В DirectComposition вы анимируйте визуальный элемент, применяя анимацию к отдельным свойствам объектов, определяющих визуальный элемент. Например, если вы хотите переместить визуальный элемент по горизонтали по экрану, примените анимацию к свойству OffsetX визуального элемента. Аналогичным образом, если вы хотите сделать простое анимированное 2D-поворот визуального элемента, вы примените анимацию к свойству Angle объекта преобразования 2D, а затем примените объект преобразования 2D к свойству Transform визуального элемента.

DirectComposition позволяет применять анимацию к любому свойству объекта, которое принимает скалярное значение. Можно применить одновременную анимацию к нескольким свойствам и нескольким объектам.

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

Функции анимации

DirectComposition анимирует свойство объекта на основе определяемой функции анимации. Функция анимации — это конструкция, указывающая, как значение свойства объекта изменяется в течение определенного периода времени. Например, можно определить функцию анимации, которая изменяет значение свойства от 1 до 360 в течение 4 секунд. Затем, если применить функцию анимации к свойству Angle объекта преобразования 2D, а затем применить объект преобразования к свойству Преобразования визуального элемента, функция анимации будет повернуть визуальный элемент в полный круг в течение 4 секунд.

Функция анимации представлена объектом анимации , созданным вызовом метода IDCompositionDevice::CreateAnimation. Вы создаете функцию анимации с помощью методов интерфейса объекта анимации IDCompositionAnimation для добавления сегментов анимации , по одному в массив, который определяет функцию анимации. При добавлении сегмента указывается отсчитываемое от нуля смещение, обозначающее время начала сегмента относительно начала функции анимации. Сегменты анимации должны быть добавлены в порядке увеличения времени начала. Попытка добавить сегмент анимации, время начала которого до или равно предыдущему сегменту завершится ошибкой. Функция анимации может иметь указанное время окончания, указывающее, когда функция должна завершиться.

Если иное не указано, функция анимации запускается, когда диспетчер окон рабочего стола (DWM) получает команду для выполнения анимации. Каждый сегмент выполняется до момента начала следующего сегмента. Любые прерывные изменения, происходящие в значении анимированного свойства между сегментами, считаются дискретными изменениями.

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

Сегменты анимации

Сегменты анимации — это основные определения времени функции анимации; они являются примитивами, из которых создаются более сложные и более сложные функции анимации уровня. Сегмент анимации создается из ряда параметров, описывающих функцию и время начала сегмента относительно начала функции анимации. Для каждого сегмента время (t) выполняется вдоль горизонтальной оси и начинается с t = 0.

Кубическая часть

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

x(t) = bt ct + d

На следующей схеме показана функция анимации, содержащая два кубовых сегмента. Первый сегмент перемещает значение от 0 до 16 в течение 4 секунд, а второй изменяет значение линейно с 16 на 0 в течение следующих 4 секунд. Первый переход происходит вдоль этого кубального полиномиального:

x(t) = t t$ 2t

и второй переход происходит вместе с этим:

x(t) = - 4t + 16

схема функции анимации с двумя кубическими сегментами

Вы добавляете кубический сегмент в функцию анимации с помощью метода IDCompositionAnimation::AddCubic.

Синусоидальный сегмент

Время синусоидального сегмента определяется следующим уравнением:

x(t) = + амплитуды * sin(t*частота*2*PI + этап*PI/180.0)

Вы добавляете синусоидальный сегмент в функцию анимации с помощью метода IDCompositionAnimation::AddSinusoidal.

Повторять сегмент

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

На следующей схеме показана функция анимации, состоящая из двух кубовых сегментов продолжительности 4 секунд, за которой следует повторяющийся сегмент, который длится 12 секунд. Сегмент повтора начинается 8 секунд в анимации и повторяет предыдущие 6 секунд анимации два раза, пока конечный сегмент не достигнет 20 секунд.

схема функции анимации, содержащей два кубовых сегмента и один сегмент повторения

Чтобы добавить сегмент повтора в функцию анимации, используйте метод IDCompositionAnimation::AddRepeat.

Конечный сегмент

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

Вы добавляете конечный сегмент путем вызова метода idCompositionAnimation::End, указывая смещение с начала функции анимации, которая указывает конечную точку функции. Смещение должно быть больше начального смещения предыдущего сегмента. Кроме того, конечный сегмент нельзя использовать в качестве первого примитива в функции анимации.

При вызове endтакже указывается окончательное значение для анимируемого свойства. Свойство устанавливается в указанное конечное значение в момент достижения конечной точки функции анимации.

После добавления конечного сегмента к функции анимации нельзя добавить другие сегменты. То есть все вызовы метода объекта анимации завершаются ошибкой, кроме IDCompositionAnimation::Reset. Вызов сброса возвращает объект анимации для очистки состояния, в котором функция анимации не содержит сегментов, в какой момент можно снова добавить сегменты.

Совместимость с диспетчером анимации Windows

Диспетчер анимации Windows (анимация Windows) выводит примитивы анимации в формате, совместимом с API DirectComposition. Это означает, что DirectComposition может создавать анимации на основе примитивов анимации, созданных анимацией Windows Animation.

Дополнительные сведения см. в разделе Диспетчер анимации Windows, метод IUIAnimationVariable2::GetCurve и управление анимацией DirectComposition с помощью Диспетчера анимации Windows версии 2.

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