Общие сведения о пользовательских анимациях
В этом разделе описывается, как и когда расширить систему анимации WPF, создавая пользовательские ключевые кадры, классы анимации или используя обратный вызов для каждого кадра для обхода.
Необходимые условия
Чтобы понять эту тему, необходимо ознакомиться с различными типами анимаций, предоставляемыми WPF. Дополнительные сведения см. в обзоре анимаций "От/До/По", Key-Frame "Обзор анимаций" и "Обзор анимаций пути".
Поскольку классы анимации наследуются от класса Freezable, вы должны ознакомиться с объектами Freezable и узнать, как наследовать от Freezable. Для получения дополнительной информации см. в обзоре замораживаемых объектов .
Расширение системы анимации
Существует несколько способов расширения системы анимации WPF в зависимости от уровня встроенной функциональности, которую вы хотите использовать. В обработчике анимации WPF есть три основных точки расширяемости:
Создайте пользовательский объект ключевого кадра, наследуя один из классов типа *<Type>* KeyFrame, например DoubleKeyFrame. Этот подход использует большую часть встроенных функций подсистемы анимации WPF.
Создайте собственный класс анимации, наследуя от AnimationTimeline или одного из классов *<Type>*AnimationBase.
Используйте обратный вызов по каждому кадру для генерации анимаций на основе каждого кадра. Этот подход полностью обходит систему анимации и тайминга.
В следующей таблице описаны некоторые сценарии расширения системы анимации.
Когда вы хотите... | Используйте этот подход |
---|---|
Настройте интерполяцию между значениями типа, который имеет соответствующий тип *<Type>*AnimationUsingKeyFrames | Создайте настраиваемый ключевой кадр. Дополнительные сведения см. в разделе Создание настраиваемого ключевого кадра. |
Настройте больше, чем просто интерполяцию между значениями типа, имеющего соответствующий тип *<Тип>*Анимация. | Создайте пользовательский класс анимации, наследующий от класса *<Type>*AnimationBase, соответствующий типу, который требуется анимировать. Дополнительные сведения см. в разделе Создание пользовательского класса анимации. |
Анимировать тип, для которого нет соответствующей анимации в WPF. | Используйте ObjectAnimationUsingKeyFrames или создайте класс, наследующий от AnimationTimeline. Дополнительные сведения см. в разделе Создание пользовательского класса анимации. |
Анимация нескольких объектов со значениями, вычисляемыми для каждого кадра и основанными на последнем наборе взаимодействий объектов. | Используйте обратный вызов для каждого кадра. Дополнительные сведения см. в разделе Создание Per-Frame обратного вызова Per-Frame. |
Создание настраиваемого ключевого кадра
Создание пользовательского класса ключевых кадров — самый простой способ расширения системы анимации. Используйте этот подход, если требуется другой метод интерполяции для анимации ключевых кадров. Как описано в Обзоре анимаций Key-Frame, анимация ключевых кадров использует ключевые кадры для генерации выходных значений. Каждый объект ключевого кадра выполняет три функции:
Указывает целевое значение с помощью свойства Value.
Указывает время достижения этого значения с помощью свойства KeyTime.
Интерполирует между значением предыдущего ключевого кадра и собственным значением посредством реализации метода InterpolateValueCore.
Инструкции по реализации
Наследуйте от абстрактного класса *<Type>*KeyFrame и реализуйте метод InterpolateValueCore. Метод InterpolateValueCore возвращает текущее значение ключевого кадра. Он принимает два параметра: значение предыдущего ключевого кадра и значение прогресса, которое колеблется от 0 до 1. Значение хода выполнения 0 указывает, что ключевой кадр только что запущен, а значение 1 указывает, что ключевой кадр только что завершен и должен вернуть значение, заданное его свойством Value.
Так как классы *<Type>*KeyFrame наследуются от класса Freezable, необходимо также переопределить ядро CreateInstanceCore для возврата нового экземпляра вашего класса. Если класс не использует свойства зависимости для хранения данных или требует дополнительной инициализации после создания, может потребоваться переопределение дополнительных методов; дополнительные сведения см. в обзоре объектов типа Freezable .
После создания пользовательской анимации *<типа>*KeyFrame его можно использовать с параметром *<Type>*AnimationUsingKeyFrames для этого типа.
Создание пользовательского класса анимации
Создание собственного типа анимации дает вам больше контроля над тем, как объект анимирован. Существует два рекомендуемых способа создания собственного типа анимации: можно наследовать от класса AnimationTimeline или от класса *<Type>*AnimationBase. Производный от класса *<Type>*Animation or *<Type>*AnimationUsingKeyFrames не рекомендуется.
Производный от <типа>AnimationBase
Производный от класса *<Type>*AnimationBase — самый простой способ создания нового типа анимации. Используйте этот подход, если вы хотите создать новую анимацию для типа, который уже имеет соответствующий класс *<Type>*AnimationBase.
Инструкции по реализации
Производный от класса *<Type>*Animation и реализующий метод GetCurrentValueCore. Метод GetCurrentValueCore возвращает текущее значение анимации. Он принимает три параметра: предлагаемое начальное значение, предлагаемое конечное значение и AnimationClock, которое используется для определения хода выполнения анимации.
Поскольку классы *<Type>*AnimationBase наследуются от класса Freezable, необходимо также переопределить ядро CreateInstanceCore, чтобы вернуть новый экземпляр вашего класса. Если класс не использует свойства зависимостей для хранения данных или требует дополнительной инициализации после создания, может потребоваться переопределить дополнительные методы; дополнительные сведения см. в обзоре замораживаемых объектов.
Дополнительные сведения см. в документации по методу GetCurrentValueCore для класса *<Type>*AnimationBase для типа, который требуется анимировать. Пример см. в примере пользовательской анимации
Альтернативные подходы
Если вы просто хотите изменить способ интерполяции значений анимации, рассмотрите возможность наследования от одного из классов *<Type>*KeyFrame. Создаваемый ключевой кадр можно использовать с соответствующим *<типом>*AnimationUsingKeyFrames, предоставляемым WPF.
Производится от AnimationTimeline
Наследуется от класса AnimationTimeline, если вы хотите создать анимацию для типа, у которого еще нет соответствующей анимации WPF, или вы хотите создать анимацию, которая не сильно типизирована.
Инструкции по реализации
Наследуйте из класса AnimationTimeline и переопределите следующие элементы:
CreateInstanceCore. Если новый класс является конкретным, необходимо переопределить CreateInstanceCore, чтобы вернуть новый экземпляр вашего класса.
GetCurrentValue — переопределите этот метод, чтобы вернуть текущее значение анимации. Он принимает три параметра: значение источника по умолчанию, целевое значение по умолчанию и AnimationClock. Используйте AnimationClock для получения текущего времени или хода выполнения анимации. Можно выбрать, следует ли использовать значения источника и назначения по умолчанию.
IsDestinationDefault — переопределите это свойство, чтобы указать, используется ли анимация значение назначения по умолчанию, указанное методом GetCurrentValue.
TargetPropertyType — переопределите это свойство, чтобы указать Type выходных данных, которые создает анимация.
Если класс не использует свойства зависимостей для хранения данных или требует дополнительной инициализации после создания, может потребоваться переопределить дополнительные методы; дополнительные сведения см. в разделе Freezable Objects Overview.
Рекомендуемая парадигма (используемая анимацией WPF) — использовать два уровня наследования:
Создайте абстрактный класс *<Type>*AnimationBase, производный от AnimationTimeline. Этот класс должен переопределить метод TargetPropertyType. Он также должен ввести новый абстрактный метод GetCurrentValueCore и переопределить GetCurrentValue, чтобы он проверял типы значений источника по умолчанию и параметры назначения по умолчанию, а затем вызывает GetCurrentValueCore.
Создайте другой класс, наследующий от вашего нового класса *<Type>*AnimationBase, и переопределите метод CreateInstanceCore, метод GetCurrentValueCore, который вы ввели, и свойство IsDestinationDefault.
альтернативные подходы
Если вы хотите анимировать тип, который не имеет соответствующей анимации From/To/By или анимации ключевого кадра, используйте ObjectAnimationUsingKeyFrames. Поскольку он слабо типизированный, ObjectAnimationUsingKeyFrames может анимировать любой тип значения. Недостатком этого подхода является то, что ObjectAnimationUsingKeyFrames поддерживает только дискретную интерполяцию.
Использование обратного вызова Per-Frame
Используйте этот подход, когда необходимо полностью обойти систему анимации WPF. Одним из сценариев этого подхода является анимация физики, где на каждом шаге анимации необходимо перекомпьютировать новое направление или положение анимированных объектов на основе последнего набора взаимодействий объектов.
Инструкции по внедрению
В отличие от других подходов, описанных в этом обзоре, для использования обратного вызова для каждого кадра вам не нужно создавать настраиваемый класс анимации или ключевого кадра.
Вместо этого необходимо зарегистрировать событие Rendering объекта, содержащего объекты, которые нужно анимировать. Этот метод обработчика событий вызывается один раз на кадр. Каждый раз, когда WPF организует перенос сохраненных данных отрисовки из визуального дерева в дерево композиции, вызывается метод вашего обработчика событий.
В обработчике событий выполните все вычисления, необходимые для эффекта анимации, и задайте свойства объектов, которые необходимо анимировать с этими значениями.
Чтобы получить время презентации текущего кадра, EventArgs, связанные с этим событием, можно привести как RenderingEventArgs, что предоставляет свойство RenderingTime, которое можно использовать для получения времени отрисовки текущего кадра.
Дополнительные сведения см. на странице Rendering.
См. также
- AnimationTimeline
- IKeyFrame
- Обзор методов анимации свойств
- Обзор замораживаемых объектов
- Key-Frame Обзор анимации
- Обзор анимации пути
- Обзор анимации
- Обзор системы анимации и тайминга
- образец анимации на заказ
.NET Desktop feedback