Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Понятие анимации

45

В предыдущих Windows-ориентированных платформах (вроде Windows Forms и MFC) разработчикам приходилось создавать собственные системы анимации с нуля. Наиболее распространенный прием заключался в применении таймера в сочетании с некоторой специальной логикой рисования. В WPF правила игры изменились и была предложена новая система анимации, основанная на свойствах (property-based). Разница между ними объясняется в следующих двух разделах.

Анимация на основе таймера

Предположим, что необходимо заставить кусок текста вращаться в окне About приложения Windows Forms. Ниже представлен традиционный способ решения этой проблемы:

  • Создайте таймер, который срабатывает периодически (скажем, каждые 50 миллисекунд).

  • Когда таймер сработает, воспользуйтесь обработчиком событий для вычисления некоторых деталей анимации, таких как новый угол поворота. Затем сделайте недействительным все окно либо его часть.

  • Сразу после этого Windows попросит окно перерисовать свое содержимое, запустив специальный код рисования.

  • В коде рисования визуализируйте повернутый текст.

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

Рисуются пиксели, а не элементы управления

Чтобы повернуть текст в Windows Forms, придется обратиться к низкоуровневой поддержке рисования GDI+. Сделать это не сложно, однако это плохо сочетается с обычными элементами окна вроде кнопок, текстовых полей, меток и т.п. В результате придется отделять анимируемое содержимое от элементов управления, и в анимацию не получится включить элементы, способные взаимодействовать с пользователем. Скажем, реализовать вращающуюся кнопку не удастся.

Подразумевается единственная анимация

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

Частота кадров анимации фиксирована

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

Сложность кода анимации растет в геометрической прогрессии

Пример с вращающимся текстом достаточно прост, но, скажем, перемещение маленького векторного изображения по определенному пути — задача более сложная. В WPF даже самая замысловатая анимация может быть определена в XAML-разметке (и сгенерирована с применением визуальных инструментов от независимых разработчиков).

Даже без поддержки анимации WPF пример с вращающимся текстом можно упростить. Это связано с тем, что WPF предлагает более совершенную графическую модель, которая гарантирует, что окно будет автоматически перерисовано, если в нем произошли какие-то изменения. Это означает, что беспокоиться об объявлении окна недействительным и его перерисовке не понадобится. Вместо этого достаточно выполнить перечисленные ниже шаги:

  • Создайте периодически срабатывающий таймер. (Для этого WPF предоставляет класс System.Windows.Threading.DispatherTimer, работающий в потоке пользовательского интерфейса.)

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

  • WPF заметит проведенные изменения в элементах окна и перерисует (а также кэширует) новое содержимое окна.

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

Хотя это, безусловно, усовершенствование, однако анимации на основе таймера все-таки присущ ряд недостатков: она приводит к появлению не слишком гибкого кода, серьезному усложнению его в случае, когда требуются более сложные эффекты, а также не обеспечивает максимально возможной производительности. Вместо этого WPF включает высокоуровневую модель, которая позволяет сосредоточиться на определении анимации, не беспокоясь о способе ее отображения. Эта модель основана на инфраструктуре свойств зависимости.

Анимация на основе свойств

Часто анимацию воспринимают как последовательность кадров. Чтобы выполнить анимацию, эти кадры отображаются друг за другом, подобно мультипликации. В WPF используется совершенно другая модель. По сути, анимация WPF — это просто способ модифицировать значение свойства зависимости через интервалы времени. Например, чтобы заставить кнопку растягиваться и сжиматься, в анимации можно модифицировать ее свойство Width. Чтобы заставить ее мерцать, можно изменять свойства кисти LinearGradientBrush, используемой для ее фона. Секрет создания правильной анимации кроется в определении того, какие именно свойства должны изменяться.

Если нужно внести изменения, которые не могут быть обеспечены модификацией свойств, значит, вам не повезло. Например, добавлять или удалять элементы в процессе анимации нельзя. Аналогично не получится попросить WPF перейти от начальной сцены к конечной (хотя некоторые обходные пути позволяют эмулировать такой эффект). И, наконец, анимацию можно применять только к свойствам зависимости, поскольку лишь эти свойства используют систему динамического разрешения свойств, которая учитывает анимацию.

На первый взгляд сосредоточенная на свойствах природа анимации WPF кажется чрезвычайно ограниченной. Однако поработав с WPF, вы обнаружите, что она на самом деле очень удобна. Фактически можно реализовать широкий диапазон эффектов анимации, используя общие свойства, которые поддерживаются всеми элементами. Но следует признать, что существует немало случаев, когда система анимации на основе свойств не работает. В качестве эмпирического правила необходимо отметить, что анимация на базе свойств — отличный способ добавить динамические эффекты к обычным в других отношениях Windows-приложениям.

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

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

Пройди тесты