Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Реализация анимации в коде.




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

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

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

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

Свойство From и свойство To.

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

Свойство From задает начальное значение для свойства Width. Если щелкать на кнопке несколько раз, то всякий раз ширина кнопки будет сбрасываться в 150, и анимация запустится вновь.

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

Фактически, наиболее часто используемым контейнером компоновки для "анимируемого" содержимого является Canvas, поскольку он позволяет легко перемещать содержимое по своей поверхности и изменять его размер. Canvas также наиболее облегченный контейнер компоновки, поскольку ему не приходится выполнять никакой дополнительной работы по компоновке при изменении свойства, подобного Width.

Извлечь текущее значение кнопки можно с использованием свойства ActualWidth, которое содержит текущую отображаемую ширину. Анимация свойства ActualWidth невозможна но можно использовать его для установки свойства From анимации:da.From = btn.ActualWidth;

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

Свойство By и способы получить аналогичный эффект.

Вместо То можно использовать свойство By. Свойство By служит для создания анимации, которая изменяет значение на определенную величину, а не до определенной величины.

Однако значение By более осмысленно, когда анимация определяется в XAML-разметке, поскольку XAML не позволяет выполнять простые вычисления.

Значения By и From можно использовать совместно, но это не сократит объем работы. Значение By просто добавляется к значению From для достижения значения То. Свойство By предоставляется большинством, хотя и не всеми классами, использующими интерполяцию. Например, оно не имеет смысла для нечисловых типов данных, таких как структура Color (применяемая в ColorAnimation).

Есть только один способ получить аналогичное поведение без применения By — можно создать аддитивную анимацию, установив свойство IsAdditive. После этого текущее значение будет автоматически добавляться к обоим значениям — From и То.

Свойство Duration.

Свойство Duration достаточно очевидно — оно принимает временной интервал между моментом запуска анимации и временем ее завершения. К счастью, Duration и TimeSpan достаточно похожи, и структура Duration предусматривает неявное приведение, с помощью которого при необходимости можно преобразовать System.TimeSpan в System.Windows.Duration.

da.Duration = TimeSpan.FromSeconds(5);

Duration также включает два специальных значения, которые не могут быть представлены объектом TimeSpan. Это Duration.Automatic и Duration.Forever. Ни одно из этих значений не применимо в текущем примере. (Automatic просто устанавливает анимацию в односекундную длительность, a Forever задает бесконечную длительность анимации, что предотвращает проявление какого-либо эффекта.) Формально анимации WPF являются временными, а это означает, что они в действительности не изменяют значения лежащего в основе свойства. Пока анимация активна, она просто переопределяет значение свойства. Однонаправленная анимация остается активной и после завершения ее работы. Это объясняется тем, что анимация должна удерживать ширину кнопки в новом размереСоздать анимацию, которая сбрасывает элементы в их исходное состояние. Это делается за счет не установки свойства То. Создать обратимую анимацию. Это делается посредством установки свойства AutoReverse в true. Изменить свойство FillBehavior. Изначально FillBehavior установлено в HoldEnd, а это означает, что когда анимация завершится, ее финальное значение будет применено к целевому свойству. Если изменить FillBehavior на Stop, то по завершении анимации свойство вернется к своему исходному значению.Удалить объект анимации по ее завершении, обработав событие Completed объекта анимации.

Completed — это нормальное событие .NET, которое принимает обычный объект EventArgs с дополнительной информацией. Это не маршрутизируемое событие. Когда возникает событие Completed, можно вновь привести анимацию в действие, вызвав метод BeginAnimation(). Понадобится просто указать свойство и передать null-ссылку для объекта анимации:

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

Класс TimeLine.

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

AnimationTimeline служит для системы анимации на основе свойств, которая рассматривалась до сих пор.

TimelineGroup позволяет синтезировать временные шкалы и управлять их воспроизведением.

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

BeginTimeУстанавливает задержку перед запуском анимации

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

SpeedRatioУвеличивает или уменьшает скорость анимации.

AccelerationRatio, DecelerationRatioДелает анимацию нелинейной, так что она запускается медленно, затем происходит ускорение (за счет увеличения AccelerationRatio) либо замедление (при увеличении DecelerationRatio).

AutoReverseЕсли это свойство равно true, то анимация будет запущена в обратном порядке, как только завершится.

FillBehaviorОпределяет то, что произойдет по завершении анимации.

RepeatBehaviorПозволяет повторить анимацию заданное количество раз либо в течение указанного интервала времени










Последнее изменение этой страницы: 2018-04-12; просмотров: 226.

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