Анимация в коде

31

Как уже известно, наиболее распространенная техника анимации — это анимация методом интерполяции, при которой свойство плавно изменяется от начальной точки до конечной. Например, если установить в качестве начального значения 1, а конечного — 10, то свойство может быстро изменяться от 1 до 1.1, 1.2, 1.3 и т.д., пока не достигнет значения 10.

Может возникнуть вопрос: как WPF определяет шаг инкремента для выполнения интерполяции? К счастью, это делается автоматически. WPF использует такой шаг инкремента, который необходим для выполнения плавной анимации при текущей частоте кадров видеосистемы. Стандартная частота, используемая WPF, составляет 60 кадров в секунду. Другими словами, каждую одну шестидесятую часть секунды WPF вычисляет все анимируемые значения и обновляет соответствующие свойства.

Простейший способ использования анимации предусматривает создание экземпляра одного из классов анимации, перечисленных выше, его конфигурирование и вызов метода BeginAnimation() элемента, который требуется модифицировать. Все элементы WPF наследуют метод BeginAnimation(), который является частью интерфейса IAnimatable, от базового класса UIElement. Другие классы, реализующие IAnimatable, включают ContentElement (базовый класс для битового содержимого потока документа) и Visual3D (базовый класс для трехмерных визуальных элементов).

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

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

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

private void btn_Click(object sender, RoutedEventArgs e)
{
     DoubleAnimation da = new DoubleAnimation();
     da.From = 150;
     da.To = this.Width - 20;
     da.Duration = TimeSpan.FromSeconds(5);
     btn.BeginAnimation(Button.WidthProperty, da);
}
Базовое состояние кнопки
Анимированное состояние кнопки

Есть три детали, которые составляют необходимый минимум для описания анимации, использующей линейную интерполяцию: начальное значение (From), конечное значение (То) и время, за которое анимация должна быть выполнена (Duration). В данном примере конечное значение основано на текущей ширине содержащего кнопку окна.

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

Пройди тесты
Лучший чат для C# программистов