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