Класс TimeLine

55

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

На рисунке показана иерархия наследования типов анимации WPF. В ней указаны базовые классы, но опущены 42 типа анимаций:

Иерархия классов анимации

Иерархия классов включает три главных ветви, унаследованные от абстрактного класса TimeLine. Класс MediaTimeLine используется при воспроизведении аудио- и видеофайлов. Класс AnimationTimeline служит для системы анимации на основе свойств, которая рассматривалась до сих пор. И, наконец, TimelineGroup позволяет синтезировать временные шкалы и управлять их воспроизведением.

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

BeginTime

Устанавливает задержку перед запуском анимации (как TimeSpan). Эта задержка добавляется к общему времени, так что пятисекундная анимация с пятисекундной задержкой займет в сумме десять секунд. Свойство BeginTime удобно для синхронизации разных анимаций, которые запускаются в одно и то же время, но должны выполнять свои действия последовательно

Duration

Устанавливает длительность времени выполнения анимации, от старта до финиша, как объект Duration

SpeedRatio

Увеличивает или уменьшает скорость анимации. Изначально SpeedRatio равно 1. Если его увеличить, то анимация завершится быстрее (например, SpeedRatio, равное 5, выполнит анимацию впятеро быстрее). Если уменьшить значение этого свойства, анимация замедлится (например, установка SpeedRatio в 0.5 приводит к получению анимации, выполняющейся вдвое дольше). Для получения того же результата можно также изменить свойство Duration анимации. Когда применяется задержка BeginTime, свойство SpeedRatio во внимание не принимается

AccelerationRatio, DecelerationRatio

Делает анимацию нелинейной, так что она запускается медленно, затем происходит ускорение (за счет увеличения AccelerationRatio) либо замедление (при увеличении DecelerationRatio). Оба значения находятся в промежутке от 0 до 1 и начинаются с 0. Кроме того, сумма обоих величин не может превышать 1.

AutoReverse

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

FillBehavior

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

RepeatBehavior

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

Хотя BeginTime, Duration, SpeedRatio и AutoReverse достаточно очевидны, некоторые другие свойства требуют более тщательного рассмотрения. В следующих разделах подробно описаны AccelerationRatio, DecelerationRatio и RepeatBehavior.

Свойства AccelerationRatio и DecelerationRatio

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

Оба эти свойства представляют процентное значение. Например, AccelerationRatio, равное 0.3. указывает на то, что вы хотите потратить 30% общей длительности анимации на ускорение. Например, в десятисекундной анимации первые три секунды пройдут с ускорением, а остальные семь секунд — на постоянной скорости. (Очевидно, что скорость в эти последние семь секунд будет выше, чем в неускоренной анимации, поскольку необходимо выполнить медленный старт.) Если установить AccelerationRatio в 0.3 и DecelerationRatio в 0.3, то ускорение будет выполняться в первые 3 секунды, следующие 4 секунды пройдут на постоянной скорости, а в последние три секунды произойдет замедление. В таком случае ясно, что сумма AccelerationRatio и DecelerationRatio не может превышать 1, поскольку невозможно потратить больше 100% времени анимации на ее ускорение и замедление.

Разумеется, можно установить AccelerationRatio в 1 (при этом скорость анимации будет расти от начала до ее конца) или же установить DecelerationRatio в 1 (анимация будет замедляться от начала до конца).

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

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

Свойство RepeatBehavior

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

widthAnimation.RepeatBehavior = new RepeatBehavior(2);

После запуска этой анимации кнопка увеличится в размерах (в течение 5 секунд), прыжком вернется к исходному размеру и вырастет снова (опять в течение 5 секунд), заполнив всю ширину окна. Если установить AutoReverse в true, то поведение будет слегка отличаться. Полная анимация пройдет вперед и назад (т.е. кнопка вырастет, после чего уменьшится), а затем все повторится заново.

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

Вместо установки счетчика повторов свойство RepeatBehavior можно также применять его для установки интервала. Чтобы сделать это, просто передайте TimeSpan конструктору RepeatBehavior. Например, следующая анимация будет повторяться в течение 13 секунд:

widthAnimation.RepeatBehavior = new RepeatBehavior (TimeSpan.FromSeconds (13));

В данном примере свойство Duration указывает, что вся анимация занимает 5 секунд. В результате установка RepeatBehavior в 13 секунд вызовет два повтора и затем остановит рост кнопки на полпути при третьем проходе анимации (на отметке 3 секунды).

Свойство RepeatBehavior можно использовать для выполнения только части анимации. Для этого понадобится указать дробную часть повторов или же применять значение TimeSpan, меньшее длительности анимации.

И, наконец, можно заставить анимацию повторяться бесконечно, передав значение RepeatBehavior.Forever.

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