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


Общие сведения о пользовательской анимации

Обновлен: Ноябрь 2007

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

Необходимые компоненты

Чтобы понимать материал данного раздела, необходимо ознакомиться с различными типами анимации, предоставляемыми WPF. Дополнительные сведения см. в Общие сведения об анимациях From/To/By, Общие сведения об анимации по ключевым кадрам и Общие сведения об анимация с использованием пути.

Поскольку классы анимации наследуются от класса Freezable, необходимо ознакомиться с объектами Freezable и способами наследования от класса Freezable. Дополнительные сведения см. в разделе Общие сведения об объектах класса Freezable.

Расширение системы анимации

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

  • Создание пользовательского объекта полного кадра путем наследования от одного из классов *<Тип>*KeyFrame, например, DoubleKeyFrame. Этот подход использует большую часть встроенных функциональных возможностей механизма анимации WPF.

  • Создание собственного класса анимации путем наследования от AnimationTimeline или одного из классов *<Тип>*AnimationBase.

  • Использование покадрового обратного вызова для создания анимации на основе отдельных кадров. Такой подход полностью обходит анимацию и систему времени.

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

Когда требуется...

Используйте следующий подход

Настроить интерполяцию между значениями типа, имеющего соответствующие <Тип>AnimationUsingKeyFrame

Создайте пользовательский ключевой кадр. Дополнительные сведения см. в разделе Создание пользовательского полного кадра.

Настроить более, чем просто интерполяцию между значениями типа, имеющего соответствующие <Тип>Animation.

Создайте пользовательский класс анимации, наследующий от класса <Тип>AnimationBase, соответствующего типу, который требуется анимировать. Дополнительные сведения см. в разделе Создание пользовательского класса анимации.

Анимировать тип, не имеющий соответствующей анимации WPF

Используйте ObjectAnimationUsingKeyFrames или создайте класс, наследующий от AnimationTimeline. Дополнительные сведения см. в разделе Создание пользовательского класса анимации.

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

Используйте покадровый обратный вызов. Дополнительные сведения см. в разделе Использование покадрового обратного вызова.

Создание пользовательского полного кадра

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

  • Задает целевое значение с помощью его свойства Value.

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

  • Осуществляет интерполяцию между значением предыдущего полного кадра и собственным значением с помощью реализации метода InterpolateValueCore.

Инструкции по реализации

Необходимо наследование от абстрактного класса *<Тип>*KeyFrame и реализация метода InterpolateValueCore. Метод InterpolateValueCore возвращает текущее значение полного кадра. Принимает два параметра: значение предыдущего полного кадра и текущее значение статуса выполнения, в диапазоне от 0 до 1. Значение 0 означает, что ключевой кадр только запущен, а значение 1 означает, что ключевой кадр только завершен и должен вернуть значение, заданное его свойством Value.

Поскольку классы *<Тип>*KeyFrame наследуют от класса Freezable, необходимо также переопределить ядро CreateInstanceCore для возврата нового экземпляра класса. Если класс не использует свойства зависимостей для хранения его данных или требует дополнительной инициализации после создания, возможно, необходимо переопределить дополнительные методы. Для получения дополнительных сведений см. Общие сведения об объектах класса Freezable.

После создания пользовательской анимации *<Тип>*KeyFrame можно использовать ее с *<Тип>*AnimationUsingKeyFrames для данного типа.

Создание пользовательского класса анимации

Создание собственного типа анимации дает больше контроля над способом анимации объекта. Существуют два рекомендованных способа создания собственного типа анимации: можно получать производный тип от класса AnimationTimeline или от класса *<Тип>*AnimationBase. Наследование от классов *<Тип>*Animation или *<Тип>*AnimationUsingKeyFrames не рекомендуется.

Наследование от <Тип>AnimationBase

Наследование от класса *<Тип>*AnimationBase является самым простым способом создания нового типа анимации. Этот подход следует использовать в случае, если требуется создать новую анимацию для типа, у которого уже есть соответствующий класс *<Тип>*AnimationBase.

Инструкции по реализации

Необходимо наследование от класса *<Тип>*Animation и реализация метода GetCurrentValueCore. Метод GetCurrentValueCore возвращает текущее значение анимации. Принимает три параметра: предлагаемое начальное значение, предлагаемое конечное значение и AnimationClock, который используется для определения статуса выполнения анимации.

Поскольку классы *<Тип>*AnimationBase наследуют от класса Freezable, необходимо также переопределить ядро CreateInstanceCore для возврата нового экземпляра класса. Если класс не использует свойства зависимостей для хранения его данных или требует дополнительной инициализации после создания, возможно, необходимо переопределить дополнительные методы. Для получения дополнительных сведений см. Общие сведения об объектах класса Freezable.

Для получения дополнительных сведений см. документацию метода GetCurrentValueCore для класса *<Тип>*AnimationBase для типа, который следует анимировать. Пример см. в разделе Пример пользовательской анимации.

Альтернативные подходы

Если просто требуется изменить способ интерполяции значений анимации, учитывая наследование от одного из классов *<Тип>*KeyFrame. Созданный ключевой кадр создания может использоваться с соответствующими *<Тип>*AnimationUsingKeyFrame, предоставляемыми WPF.

Наследование от AnimationTimeline

Следует наследовать от класса AnimationTimeline, когда требуется создать анимацию для типа, еще не имеющего соответствующей анимации WPF, или требуется создать не строго типизированную анимацию.

Инструкции по реализации

Нужны наследование от класса AnimationTimeline и переопределение следующих членов:

  • CreateInstanceCore — если новый класс является конкретным, необходимо переопределить CreateInstanceCore для возврата нового экземпляра класса.

  • GetCurrentValue — нужно переопределить этот метод для возврата текущего значения анимации. Принимает три параметра: начальное значение по умолчанию, конечное значение по умолчанию, объект AnimationClock. AnimationClock используется для получения текущего времени или статуса выполнения для анимации. Можно выбрать, использовать ли начальное и конечное значения по умолчанию.

  • IsDestinationDefault — нужно переопределить это свойство, чтобы указывать, использует ли анимация конечное значение по умолчанию, заданное методом GetCurrentValue.

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

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

Рекомендованной парадигмой (используемой анимацией WPF) является использование двух уровней наследования:

  1. Создание абстрактного класса *<Тип>*AnimationBase, производного от AnimationTimeline. Этот класс должен переопределить метод TargetPropertyType. Он должен также ввести новый абстрактный метод, GetCurrentValueCore, и переопределить GetCurrentValue так, чтобы он проверял типы параметров начального и конечного значений по умолчанию, а затем вызывал GetCurrentValueCore.

  2. Создание другого класса, наследующего от нового класса *<Тип>*AnimationBase и переопределяющего метод CreateInstanceCore, введенный метод GetCurrentValueCore и свойство IsDestinationDefault.

Альтернативные подходы

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

Использование покадрового обратного вызова

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

Инструкции по реализации

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

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

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

Чтобы определить продолжительность текущего кадра, EventArgs, связанные с этим событием, могут быть приведены к RenderingEventArgs, предоставляющим свойство RenderingTime, которое можно использовать для получения времени отрисовки текущего кадра.

Дополнительные сведения см. на странице Rendering). Пример см. в разделе Пример покадровой анимации.

См. также

Задачи

Пример пользовательской анимации

Пример покадровой анимации

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

Общие сведения о методах анимации свойств

Общие сведения об объектах класса Freezable

Общие сведения об анимациях From/To/By

Общие сведения об анимации по ключевым кадрам

Общие сведения об анимация с использованием пути

Общие сведения об эффектах анимации

Общие сведения об анимации и системе управления временем

Ссылки

AnimationTimeline

IKeyFrame