Создание и изменение пользовательских анимационных поведений в Python
Обзор
Пользовательские анимационные поведения позволяют управлять отдельными операциями внутри анимационного эффекта, такими как изменение цвета, вращение фигуры или следование по редактируемому пути движения. Это руководство показывает, как создавать и комбинировать поведения, настраивать их време́ни, просматривать и изменять существующие анимации и проверять, сохраняются ли их свойства при сохранении и повторном открытии презентации.
Для предопределённых эффектов и триггеров клика см. Анимация фигур.
Понимание модели анимации
Анимация организована как Timeline → Sequence → Effect → Behaviors:
- [timeline](https://reference.aspose.com/slides/ru/python-net/aspose.slides/baseslide/timeline/) слайда содержит основную последовательность и интерактивные последовательности.
- [Sequence](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/sequence/) содержит эффекты, потенциально направленные на разные фигуры.
- [Effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/effect/) определяет целевую фигуру, предустановку, подтип и временные параметры эффекта.
- [Effect.behaviors](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/effect/behaviors/) содержит операции, реализующие эффект: изменение цвета, перемещение, вращение, установка свойства и др.
Создание отдельных поведений
Вызовите [Sequence.add_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/sequence/add_effect/) для создания эффекта и доступа к его коллекции [behaviors](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/effect/behaviors/). Предустановка может автоматически заполнить эту коллекцию. Сохраняйте её операции при расширении предустановки или используйте [clear](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/clear/) при намеренной замене.
[BehaviorFactory](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/) создаёт восемь типов поведения, показанных ниже. Движение рассматривается в разделе Создание пути движения. Каждый пример создания — полная программа; последующие примеры редактирования указывают, какой файл вывода они используют.
Вращение
Используйте [create_rotation_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_rotation_effect/) для создания вращения. [by](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/rotationeffect/by/) задаёт относительный угол в градусах; [from_address](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/rotationeffect/from_address/) и [to](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/rotationeffect/to/) задают конечные точки.
Пример начинается с эффекта Spin, заменяет его предустановленные операции одним поведением вращения и задаёт этому действию продолжительность две секунды. Относительный угол 90 ° выражает четверть оборота от исходной ориентации фигуры, поэтому отдельный начальный угол не нужен.
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.SPIN, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
rotation = factory.create_rotation_effect()
rotation.by = 90
rotation.timing.duration = 2
effect.behaviors.add(rotation)
presentation.save("rotation.pptx", slides.export.SaveFormat.PPTX)
rotation.pptx содержит одну фигуру и одно поведение вращения. Примеры коллекции, тайминга и редактирования вращения ниже используют этот файл.
Масштабирование
Используйте [create_scale_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_scale_effect/) с процентами X/Y: [from_address](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/scaleeffect/from_address/) и [to](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/scaleeffect/to/) описывают начальный и конечный размер, а [by](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/scaleeffect/by/) — относительное изменение. Здесь 100 % означает исходный размер.
Пример увеличивает оба измерения с 100 % до 125 % за две секунды. Использование одинаковых горизонтальных и вертикальных процентов сохраняет пропорции фигуры; разные проценты растягивают одну из сторон сильнее.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.GROW_SHRINK, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
scale = factory.create_scale_effect()
scale.from_address = draw.PointF(100, 100)
scale.to = draw.PointF(125, 125)
scale.timing.duration = 2
effect.behaviors.add(scale)
presentation.save("scale.pptx", slides.export.SaveFormat.PPTX)
Цвет
Используйте [create_color_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_color_effect/) для изменения заливки с синего на оранжевый. [from_address](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/coloreffect/from_address/) и [to](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/coloreffect/to/) — цвета; [by](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/coloreffect/by/) — цветовое смещение. [Behavior.properties](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behavior/properties/) определяет анимируемый атрибут.
Заливка фигуры инициализируется синим, соответствующим начальному цвету анимации. Выбор атрибута заливки сообщает поведению, какую часть фигуры менять; только конечные цвета не указывают атрибут. Сохранённый эффект описывает двухсекундный переход к оранжевому.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
shape.fill_format.fill_type = slides.FillType.SOLID
shape.fill_format.solid_fill_color.color = draw.Color.blue
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.CHANGE_FILL_COLOR, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
color = factory.create_color_effect()
color.properties.add(slides.animation.BehaviorProperty.fill_color.value)
color.from_address.color = draw.Color.blue
color.to.color = draw.Color.orange
color.timing.duration = 2
effect.behaviors.add(color)
presentation.save("color.pptx", slides.export.SaveFormat.PPTX)
Фильтр
Используйте [create_filter_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_filter_effect/) для выбора стирания. [type](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/filtereffect/type/), [subtype](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/filtereffect/subtype/) и [reveal](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/filtereffect/reveal/) задают фильтр, направление и то, будет ли фигура отображаться или скрываться.
Этот пример настраивает двухсекундное стирание, которое раскрывает фигуру с помощью подтипа «right-direction». Параметры фильтра принадлежат поведению внутри эффекта, поэтому они задаются после удаления оригинальных операций предустановки.
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.WIPE, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
filter_behavior = factory.create_filter_effect()
filter_behavior.type = slides.animation.FilterEffectType.WIPE
filter_behavior.subtype = slides.animation.FilterEffectSubtype.RIGHT
filter_behavior.reveal = slides.animation.FilterEffectRevealType.IN
filter_behavior.timing.duration = 2
effect.behaviors.add(filter_behavior)
presentation.save("filter.pptx", slides.export.SaveFormat.PPTX)
Свойство
Используйте [create_property_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_property_effect/) для анимации непрозрачности. [from_address](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/propertyeffect/from_address/), [to](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/propertyeffect/to/) и [by](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/propertyeffect/by/) — строки, интерпретируемые с помощью [value_type](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/propertyeffect/value_type/) и [calc_mode](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/propertyeffect/calc_mode/). Выбирайте конечные точки или относительное смещение, а не задавайте все три без разбора.
Здесь выбран атрибут «opacity», а числовые строки обозначают изменение от 25 % непрозрачности до полной. Линейная интерполяция описывает постепенное изменение между этими значениями. При адаптации примера к другому атрибуту выберите тип значения и конечные значения, соответствующие этому атрибуту.
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.FADE, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
property_behavior = factory.create_property_effect()
property_behavior.properties.add(slides.animation.BehaviorProperty.style_opacity.value)
property_behavior.value_type = slides.animation.PropertyValueType.NUMBER
property_behavior.calc_mode = slides.animation.PropertyCalcModeType.LINEAR
property_behavior.from_address = "0.25"
property_behavior.to = "1"
property_behavior.timing.duration = 2
effect.behaviors.add(property_behavior)
presentation.save("property.pptx", slides.export.SaveFormat.PPTX)
Установка
Используйте [create_set_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_set_effect/) для назначения видимости через [to](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/seteffect/to/). Поведение «set» не интерполирует между конечными точками.
Пример выбирает атрибут «visibility» и присваивает строку visible при выполнении поведения. Прямоугольник уже видим в этой минимальной презентации, поэтому присваивание может не вызвать заметного визуального изменения само по себе. Такая операция полезна как часть более крупного эффекта, который также контролирует момент скрытия или отображения фигуры.
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.APPEAR, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
set_behavior = factory.create_set_effect()
set_behavior.properties.add(slides.animation.BehaviorProperty.style_visibility.value)
set_behavior.to = "visible"
effect.behaviors.add(set_behavior)
presentation.save("set.pptx", slides.export.SaveFormat.PPTX)
Команда
Используйте [create_command_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_command_effect/) и задайте [type](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/commandeffect/type/), [command_string](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/commandeffect/command_string/) и [shape_target](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/commandeffect/shape_target/). Поместите WAV‑запись sample.wav в рабочий каталог. Пример встраивает её с помощью [add_audio_frame_embedded](https://reference.aspose.com/slides/ru/python-net/aspose.slides/shapecollection/add_audio_frame_embedded/) и прикрепляет команду воспроизведения к аудио‑кадру.
Аудио‑кадр является одновременно целью эффекта и целевым объектом команды. Это связывает запрос воспроизведения с встроенной записью; одна лишь строка команды не указывает, какой медиа‑объект управлять. Эффект настроен на запуск по щелчку во время показа слайдов.
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
with open("sample.wav", "rb") as audio_stream:
audio_frame = slide.shapes.add_audio_frame_embedded(100, 100, 40, 40, audio_stream)
effect = slide.timeline.main_sequence.add_effect(audio_frame, slides.animation.EffectType.MEDIA_PLAY, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
command = factory.create_command_effect()
command.type = slides.animation.CommandEffectType.CALL
command.command_string = "play"
command.shape_target = audio_frame
effect.behaviors.add(command)
presentation.save("command.pptx", slides.export.SaveFormat.PPTX)
Сохранение помещает команду в command.pptx; запись не будет воспроизводиться. Воспроизведение требует проигрывателя слайдов, поддерживающего команду и её медиа‑цель.
Управление коллекцией поведения
[BehaviorCollection](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/) поддерживает [add](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/add/), [insert](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/insert/), [remove](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/remove/) и [remove_at](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/remove_at/). В этом примере открывается rotation.pptx, добавляется масштабирование, перемещается перед вращением и удаляется вращение. Удаление и повторная вставка того же объекта меняет его сохранённую позицию без создания копии.
Последовательность правок меняет коллекцию из rotation–scale в scale–rotation, а затем оставляет только scale. Индексы относятся к текущей коллекции, поэтому удаление использует новый индекс вращения после переупорядочивания. Финальная переборка подтверждает, какое поведение будет сохранено.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation("rotation.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
behaviors = effect.behaviors
factory = slides.animation.BehaviorFactory()
scale = factory.create_scale_effect()
scale.to = draw.PointF(125, 125)
scale.timing.duration = 2
behaviors.add(scale)
behaviors.remove(scale)
behaviors.insert(0, scale)
behaviors.remove_at(1)
for behavior in behaviors:
print(type(behavior).__name__)
presentation.save("collection-edited.pptx", slides.export.SaveFormat.PPTX)
Результат — ScaleEffect: осталось только масштабирование. Порядок в коллекции сам по себе не планирует последовательность выполнения поведений. Очищайте коллекцию только при полном замене её операций.
Настройка тайминга поведения
[Behavior.timing](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behavior/timing/) раскрывает [Timing](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/), независимо от [Effect.timing](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/effect/timing/). Тайминг эффекта планирует весь эффект; тайминг поведения описывает операцию внутри него.
Установка длительности, задержки, повторов и ускорения
Откройте rotation.pptx и задайте [duration](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/duration/) и [trigger_delay_time](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/trigger_delay_time/) в секундах, затем настройте [repeat_count](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/repeat_count/). [accelerate](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/accelerate/) и [decelerate](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/decelerate/) — доли от длительности; их сумма не должна превышать 1.
Входной файл — тот, что создан в примере вращения, где первое поведение известно как вращение. Этот пример меняет только тайминг этого поведения; угол 90 ° остаётся неизменным. Разделение угла и тайминга упрощает регулировку темпа без перестройки анимации.
import aspose.slides as slides
with slides.Presentation("rotation.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
rotation = effect.behaviors[0]
rotation.timing.duration = 2
rotation.timing.trigger_delay_time = 0.5
rotation.timing.repeat_count = 3
rotation.timing.accelerate = 0.2
rotation.timing.decelerate = 0.2
presentation.save("timing.pptx", slides.export.SaveFormat.PPTX)
Поведение использует длительность две секунды, задержку полсекунды и количество повторов 3. Первые и последние 20 % длительности отводятся ускорению и замедлению.
Другие политики повторов включают [repeat_duration](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/repeat_duration/), [repeat_until_end_slide](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/repeat_until_end_slide/), и [repeat_until_next_click](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/repeat_until_next_click/); выбирайте одну политику, а не включайте их все одновременно. [auto_reverse](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/timing/auto_reverse/) воспроизводит анимацию в обратном порядке после прямого прохода. Ускорение и замедление применяются к непрерывным изменениям, а не к дискретным назначениям или командам.
Создание пути движения
Используйте [create_motion_effect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorfactory/create_motion_effect/) для создания движения. Его [from_address](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioneffect/from_address/), [to](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioneffect/to/) и [by](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioneffect/by/) описывают координаты или смещения в процентах. Для редактируемого маршрута создайте [MotionPath](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motionpath/) и присвойте его свойству [MotionEffect.path](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioneffect/path/). [MotionPath](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motionpath/) хранит команды пути.
[MotionCommandPathType](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioncommandpathtype/) выбирает операцию:
| Команда | Точки | Значение |
|---|---|---|
| MOVE_TO | One | Устанавливает начальную позицию. |
| LINE_TO | One | Перемещает по прямому сегменту к конечной точке. |
| CURVE_TO | Three | Следует кубической кривой, задаваемой двумя контрольными точками и конечной точкой. |
| CLOSE_LOOP | None | Возвращается к начальной позиции. |
| END | None | Завершает путь. |
[MotionPathPointsType](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motionpathpointstype/) описывает характеристики редактирования точек, такие как угловые или сглаженные точки. Это не заменяет тип команды. Для примера кривой ниже используйте тип кривой, а для прямых сегментов — тип угла.
Координаты пути нормализованы к размерам слайда: смещение X = 0.25 соответствует четверти ширины слайда, а не 0.25 pt. Положительный Y направлен вниз. Абсолютные команды задают позиции в системе координат пути; относительные команды задают смещения от текущей позиции. Это отдельно от [origin](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioneffect/origin/), который выбирает эталонную систему пути, и от [path_edit_mode](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioneffect/path_edit_mode/), управляющего тем, как путь перемещается при перемещении фигуры.
Создание прямого пути
Создайте поведение движения с начальной точкой, одним прямым сегментом и командой завершения. [MotionPath.add](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motionpath/add/) принимает тип команды, её точки, тип точек и флаг относительных координат.
Начальная команда устанавливает (0, 0), а линия заканчивается в (0.25, 0), задавая горизонтальное смещение в одну четверть ширины слайда. Команда завершения не имеет координатных точек. После присвоения пути добавление поведения движения к эффекту связывает этот маршрут с прямоугольником.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 160, 80)
effect = slide.timeline.main_sequence.add_effect(shape, slides.animation.EffectType.PATH_RIGHT, slides.animation.EffectSubtype.NONE, slides.animation.EffectTriggerType.ON_CLICK)
effect.behaviors.clear()
factory = slides.animation.BehaviorFactory()
motion = factory.create_motion_effect()
motion.origin = slides.animation.MotionOriginType.LAYOUT
motion.timing.duration = 2
path = slides.animation.MotionPath()
path.add(slides.animation.MotionCommandPathType.MOVE_TO, [draw.PointF(0, 0)], slides.animation.MotionPathPointsType.AUTO, False)
path.add(slides.animation.MotionCommandPathType.LINE_TO, [draw.PointF(0.25, 0)], slides.animation.MotionPathPointsType.CORNER, False)
path.add(slides.animation.MotionCommandPathType.END, [], slides.animation.MotionPathPointsType.NONE, False)
motion.path = path
effect.behaviors.add(motion)
presentation.save("motion.pptx", slides.export.SaveFormat.PPTX)
motion.pptx содержит одно поведение движения с тремя командами пути. Приведённые ниже примеры редактирования файлов используют эту известную структуру.
Сравнение абсолютных и относительных координат
Эти два объекта пути описывают один и тот же маршрут. Абсолютная команда заканчивается в (0.3, 0.1); относительная команда добавляет (0.1, 0.1) к текущей позиции (0.2, 0).
Оба пути начинаются в одинаковой позиции. Для относительной линии добавьте её смещения X и Y к текущей позиции, чтобы получить конечную точку; для абсолютной линии прочитайте конечную точку напрямую. Переключение флага без преобразования координат опишет иной маршрут.
import aspose.pydrawing as draw
import aspose.slides as slides
absolute_path = slides.animation.MotionPath()
absolute_path.add(slides.animation.MotionCommandPathType.MOVE_TO, [draw.PointF(0.2, 0)], slides.animation.MotionPathPointsType.AUTO, False)
absolute_path.add(slides.animation.MotionCommandPathType.LINE_TO, [draw.PointF(0.3, 0.1)], slides.animation.MotionPathPointsType.CORNER, False)
relative_path = slides.animation.MotionPath()
relative_path.add(slides.animation.MotionCommandPathType.MOVE_TO, [draw.PointF(0.2, 0)], slides.animation.MotionPathPointsType.AUTO, False)
relative_path.add(slides.animation.MotionCommandPathType.LINE_TO, [draw.PointF(0.1, 0.1)], slides.animation.MotionPathPointsType.CORNER, True)
Присвойте любой из путей поведению движения, чтобы использовать его в презентации. Последний логический аргумент выбирает относительные координаты для этой команды.
Замена линии на кривую
Откройте motion.pptx и замените её команду линии кубической кривой. Сначала укажите две контрольные точки, затем конечную точку.
Начальная позиция задаётся предыдущей командой. Первые две точки формируют кривую, третья — её конечную точку; они не являются тремя последовательными пунктами назначения. Обновление типа команды, типа редактирования точек и массива точек одновременно сохраняет сегмент согласованным с новой геометрией.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation("motion.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
motion = effect.behaviors[0]
path = motion.path
path[1].command_type = slides.animation.MotionCommandPathType.CURVE_TO
path[1].points_type = slides.animation.MotionPathPointsType.CURVE_SMOOTH
path[1].points = [draw.PointF(0.1, 0), draw.PointF(0.2, 0.1), draw.PointF(0.3, 0.1)]
presentation.save("curve.pptx", slides.export.SaveFormat.PPTX)
Путь в curve.pptx всё ещё имеет три команды; его средняя команда теперь определяет кривую.
Просмотр и редактирование сохранённого пути
Каждый [MotionCmdPath](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioncmdpath/) раскрывает [points](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioncmdpath/points/), [command_type](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioncmdpath/command_type/), [points_type](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioncmdpath/points_type/) и [is_relative](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motioncmdpath/is_relative/). Последующие примеры работают с известным трёхкомандным путём в motion.pptx. Для произвольного ввода найдите нужный эффект и проверьте типы команд и число точек перед редактированием по индексу.
Чтение команд и координат
Считайте путь без изменения. Команды End и Close‑loop не требуют точек, поэтому допускайте массив точек None.
Вывод сопоставляет каждую команду с её флагом относительных координат перед перечислением точек. Это позволяет отличать конечную точку от смещения перед изменением пути. Кривая будет перечислять три точки, тогда как прямой отрезок в этом файле — только одну.
import aspose.slides as slides
with slides.Presentation("motion.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
motion = effect.behaviors[0]
for segment in motion.path:
print(f"{segment.command_type}, relative: {segment.is_relative}")
if segment.points is not None:
for point in segment.points:
print(f"X={point.x}, Y={point.y}")
Список содержит стартовую точку, абсолютную линию, заканчивающуюся в (0.25, 0), и команду End.
Изменение конечной точки
Откройте motion.pptx и замените массив точек линии, переместив её конечную точку.
Во входном файле индекс 0 — стартовая команда, индекс 1 — линия. Замена единственной точки линии меняет её назначение без изменения типа команды, тайминга или позиции в коллекции. Поскольку команда использует абсолютные координаты, новая пара задаёт позицию, а не добавочное смещение.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation("motion.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
motion = effect.behaviors[0]
motion.path[1].points = [draw.PointF(0.4, 0.1)]
presentation.save("motion-endpoint.pptx", slides.export.SaveFormat.PPTX)
Линия в motion-endpoint.pptx заканчивается в (0.4, 0.1); оригинальный файл остаётся без изменений.
Замена сегмента
Используйте [insert](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motionpath/insert/) и [remove_at](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/motionpath/remove_at/) для замены линии в motion.pptx. Вставка смещает старую линию к индексу 2.
Это демонстрирует замену объекта команды, а не редактирование его координат. После вставки коллекция временно содержит стартовую команду, новую линию, старую линию и команду End. Удаление индекса 2 исключает старую линию, оставляя новый маршрут на месте.
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation("motion.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
motion = effect.behaviors[0]
path = motion.path
path.insert(1, slides.animation.MotionCommandPathType.LINE_TO, [draw.PointF(0.2, 0.1)], slides.animation.MotionPathPointsType.CORNER, False)
path.remove_at(2)
presentation.save("motion-edited.pptx", slides.export.SaveFormat.PPTX)
Сохранённый путь всё ещё имеет три команды, новая линия заканчивается в (0.2, 0.1), а команда End стоит последней.
Изменение и проверка существующего поведения
Когда индекс поведения неизвестен, выберите его по типу. Этот пример открывает rotation.pptx, находит его [RotationEffect](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/rotationeffect/), меняет угол и проверяет сохранённое значение после повторного открытия.
Проверка типа позволяет пропускать поведения, не являющиеся вращениями. Второе чтение загружает сохранённый файл в отдельный объект презентации, поэтому сравнение проверяет данные, а не значение, оставшееся в памяти. Пример по‑прежнему предполагает, что известный эффект первый в основной последовательности; выбор поведения по типу не гарантирует нахождение нужного эффекта в произвольной презентации.
import aspose.slides as slides
with slides.Presentation("rotation.pptx") as presentation:
effect = presentation.slides[0].timeline.main_sequence[0]
for behavior in effect.behaviors:
if isinstance(behavior, slides.animation.RotationEffect):
behavior.by = 180
presentation.save("rotation-edited.pptx", slides.export.SaveFormat.PPTX)
with slides.Presentation("rotation-edited.pptx") as reopened:
saved_effect = reopened.slides[0].timeline.main_sequence[0]
for behavior in saved_effect.behaviors:
if isinstance(behavior, slides.animation.RotationEffect):
print(f"Rotation preserved: {abs(behavior.by - 180) < 0.001}")
Вывод: Rotation preserved: True. Применяйте тот же шаблон проверки типов к другим поведениям. Для полного контроля сохраняемости сравните целевую фигуру, эффект, типы и порядок поведений, тайминг и команды пути. Для чисел используйте допускаемую погрешность. Для презентации с неизвестной структурой анимации см. Чтение анимаций фигур для обхода основных и интерактивных последовательностей.
Порядок поведения, предустановки и воспроизведение
Порядок в [BehaviorCollection](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behaviorcollection/) — это сохранённый порядок операций эффекта. Это не плейлист, где каждое поведение автоматически ждёт завершения предыдущего. Тайминг и охватывающий эффект определяют планирование. Поведения могут перекрываться, а операции над одним свойством могут взаимодействовать через [additive](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behavior/additive/) и [accumulate](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/behavior/accumulate/). Не используйте переупорядочивание коллекции как единственное средство планировать «переместить, затем вращать»; применяйте явный тайминг или отдельные эффекты, как описано в Анимации фигур.
[type](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/effect/type/) и [subtype](https://reference.aspose.com/slides/ru/python-net/aspose.slides.animation/effect/subtype/) эффекта описывают его предустановку. Это не полное описание отредактированного дерева поведения. Сначала выберите предустановку и подтип, а затем настраивайте поведения: изменение предустановки может пересоздать коллекцию и удалить ваши пользовательские операции. Например, смена пользовательского эффекта Spin на Fade может заменить его поведение вращения на установки и фильтры. После изменения предустановки или подтипа снова проверьте коллекцию. Очистка предустановленных поведений также может удалить операции видимости или инициализации, необходимые предустановке. Примеры намеренно используют видимые фигуры и заменяют поведения; они не перестраивают полную реализацию каждой предустановки.
Совместимость форматов
Сохранённое дерево поведения не гарантирует идентичное воспроизведение во всех просмотровщиках или экспортных рендерах. Проверяйте сохранённые данные и визуальный результат отдельно.
| Формат или вывод | Что проверять |
|---|---|
| PPTX | Используйте как основной формат для этих примеров. Откройте файл повторно, чтобы убедиться в сохранении редактируемого дерева поведения, затем проверьте воспроизведение в целевой версии PowerPoint. |
| PPT | Устаревшее двоичное представление может отличаться от PPTX. Выполните отдельный цикл сохранения‑повторного открытия и тест воспроизведения; не делайте выводы о поддержке всех пользовательских комбинаций только из успешного вывода PPTX. |
| PDF, PNG, JPEG и другие статические изображения слайдов | Содержат статическое представление слайда, а не проигрываемую временную шкалу поведения или гарантированный конечный кадр анимации. |
| HTML5 | Может воспроизводить поддерживаемые анимации, когда в параметрах экспорта включена анимация фигур. Тестируйте пользовательские комбинации в браузере. |
| Animated GIF | Сохраняет отрендеренные кадры, а не редактируемые поведения или интерактивные клики. Проверьте фактическое отрисованное движение. |
| Video | Рендерит кадры анимации и кодирует их в видео. Поддержка ограничена поддерживаемыми анимациями и эффектами; команды и интерактивные события не превращаются в редактируемую временную шкалу. |
ЧаВо
Почему мой эффект содержит поведения до того, как я их добавил?
Создание предопределённого эффекта может создавать его базовые операции. Просмотрите их, прежде чем решить, расширять предустановку или заменять её поведения.
Перемещение поведения в начало заставит его воспроизводиться первым?
Не обязательно. Порядок в коллекции не заменяет тайминг. Проверяйте задержки, длительности и взаимодействия между операциями над одним свойством.
Почему у команды End нет точек?
Она обозначает конец пути и не требует координат. При проверке пути, считанного из файла, учитывайте возможность массива точек None.
Достаточно ли успешного кругового прохода, чтобы подтвердить воспроизведение?
Нет. Повторное открытие подтверждает сохранение проверяемых свойств. Тестируйте проигрыватель слайдов или экспорт анимации отдельно, чтобы убедиться в визуальном поведении.