在演示文稿中使用 PHP 应用形状动画
动画是可以应用于文本、图像、形状或图表的视觉效果。它们为演示文稿或其组成部分赋予生机。
为什么在演示文稿中使用动画?
使用动画,您可以
- 控制信息流
- 强调重要要点
- 提升观众的兴趣或参与度
- 使内容更易于阅读、吸收或处理
- 将读者或观众的注意力引导到演示文稿中的重要部分
PowerPoint 在 进入、退出、强调和运动路径类别中提供了许多动画和动画效果的选项和工具。
Aspose.Slides 中的动画
- Aspose.Slides 在
Aspose.Slides.Animation命名空间下提供了处理动画所需的类和类型, - Aspose.Slides 在 EffectType 枚举下提供了超过 150 种动画效果。这些效果本质上与 PowerPoint 中使用的效果相同(或等效)。
将动画应用于文本框
Aspose.Slides for PHP via Java 允许您对形状中的文本应用动画。
- 创建 Presentation 类的实例。
- 通过索引获取幻灯片的引用。
- 添加一个矩形 AutoShape。
- 向
AutoShape的 TextFrame 添加文本。 - 获取主效果序列。
- 为 AutoShape 添加动画效果。
- 使用
TextAnimation.setBuildType方法并提供来自BuildType枚举的值。 - 将演示文稿写入磁盘为 PPTX 文件。
下面的 PHP 代码演示如何将 Fade 效果应用于 AutoShape 并将文本动画设置为 By 1st Level Paragraphs 值:
# 实例化一个表示演示文稿文件的 Presentation 类。
$pres = new Presentation();
try {
$sld = $pres->getSlides()->get_Item(0);
# 添加带文本的新 AutoShape
$autoShape = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 20, 20, 150, 100);
$textFrame = $autoShape->getTextFrame();
$textFrame->setText("First paragraph \nSecond paragraph \n Third paragraph");
# 获取幻灯片的主序列。
$sequence = $sld->getTimeline()->getMainSequence();
# 为形状添加淡入淡出动画效果
$effect = $sequence->addEffect($autoShape, EffectType::Fade, EffectSubType::None, EffectTriggerType::OnClick);
# 按一级段落为形状文本添加动画
$effect->getTextAnimation()->setBuildType(BuildType::ByLevelParagraphs1);
# 将 PPTX 文件保存到磁盘
$pres->save($path . "AnimText_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
将动画应用于图片框
- 创建 Presentation 类的实例。
- 通过索引获取幻灯片的引用。
- 在幻灯片上添加或获取一个 PictureFrame。
- 获取主效果序列。
- 为 PictureFrame 添加动画效果。
- 将演示文稿写入磁盘为 PPTX 文件。
下面的 PHP 代码演示如何将 Fly 效果应用于图片框:
# 实例化一个表示演示文稿文件的 Presentation 类。
$pres = new Presentation();
try {
# 加载要添加到演示文稿图像集合的图像
$picture;
$image = Images->fromFile("aspose-logo.jpg");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# 向幻灯片添加图片框
$picFrame = $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, $picture);
# 获取幻灯片的主序列。
$sequence = $pres->getSlides()->get_Item(0)->getTimeline()->getMainSequence();
# 向图片框添加从左侧飞入的动画效果
$effect = $sequence->addEffect($picFrame, EffectType::Fly, EffectSubType::Left, EffectTriggerType::OnClick);
# 将 PPTX 文件保存到磁盘
$pres->save($path . "AnimImage_out.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
将动画应用于形状
- 创建 Presentation 类的实例。
- 通过索引获取幻灯片的引用。
- 添加一个矩形 AutoShape。
- 添加一个斜面 AutoShape(当点击此对象时,动画将播放)。
- 为斜面形状创建效果序列。
- 创建自定义
UserPath。 - 为
UserPath添加移动命令。 - 将演示文稿写入磁盘为 PPTX 文件。
下面的 PHP 代码演示如何将 PathFootball(路径足球)效果应用于形状:
# 实例化一个表示 PPTX 文件的 Presentation 类。
$pres = new Presentation();
try {
$sld = $pres->getSlides()->get_Item(0);
# 为现有形状从头创建 PathFootball 效果。
$ashp = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 150, 150, 250, 25);
$ashp->addTextFrame("Animated TextBox");
# 添加 PathFootBall 动画效果
$pres->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->addEffect($ashp, EffectType::PathFootball, EffectSubType::None, EffectTriggerType::AfterPrevious);
# 创建某种“按钮”。
$shapeTrigger = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Bevel, 10, 10, 20, 20);
# 为此按钮创建一系列效果。
$seqInter = $pres->getSlides()->get_Item(0)->getTimeline()->getInteractiveSequences()->add($shapeTrigger);
# 创建自定义用户路径。我们的对象将在按钮点击后才移动。
$fxUserPath = $seqInter->addEffect($ashp, EffectType::PathUser, EffectSubType::None, EffectTriggerType::OnClick);
# 为移动添加命令,因为创建的路径为空。
$motionBhv = $fxUserPath->getBehaviors()->get_Item(0);
$pts = new Point2DFloat[1];
$pts[0] = new Point2DFloat(0.076, 0.59);
$motionBhv->getPath()->add(MotionCommandPathType::LineTo, $pts, MotionPathPointsType::Auto, true);
$pts[0] = new Point2DFloat(-0.076, -0.59);
$motionBhv->getPath()->add(MotionCommandPathType::LineTo, $pts, MotionPathPointsType::Auto, false);
$motionBhv->getPath()->add(MotionCommandPathType::End, null, MotionPathPointsType::Auto, false);
# 将 PPTX 文件写入磁盘
$pres->save("AnimExample_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
获取应用于形状的动画效果
以下示例展示如何使用来自 Sequence 类的 getEffectsByShape 方法获取应用于形状的所有动画效果。
示例 1:获取普通幻灯片上形状应用的动画效果
之前,您已经学习了如何向 PowerPoint 演示文稿中的形状添加动画效果。以下示例代码展示如何获取演示文稿 AnimExample_out.pptx 中第一张普通幻灯片上第一个形状所应用的效果。
$Array = new java_class("java.lang.reflect.Array");
$presentation = new Presentation("AnimExample_out.pptx");
try {
$firstSlide = $presentation->getSlides()->get_Item(0);
# 获取幻灯片的主动画序列。
$sequence = $firstSlide->getTimeline()->getMainSequence();
# 获取第一张幻灯片上的第一个形状。
$shape = $firstSlide->getShapes()->get_Item(0);
# 获取应用于形状的动画效果。
$shapeEffects = $sequence->getEffectsByShape($shape);
if (java_values($Array->getLength($shapeEffects)) > 0) {
echo("The shape " . $shape->getName() . " has " . $Array->getLength($shapeEffects) . " animation effects.");
}
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
示例 2:获取所有动画效果,包括从占位符继承的效果
如果普通幻灯片上的形状拥有位于布局幻灯片和/或母版幻灯片的占位符,并且这些占位符已添加动画效果,则在放映期间该形状将播放所有效果,包括从占位符继承的效果。
假设我们有一个 PowerPoint 演示文稿文件 sample.pptx,其中一张幻灯片仅包含一个页脚形状,文本为 “Made with Aspose.Slides”,并对该形状应用了 Random Bars 效果。

再假设在 布局 幻灯片的页脚占位符上应用了 Split 效果。

最后,在 母版 幻灯片的页脚占位符上应用了 Fly In 效果。

以下示例代码展示如何使用来自 Shape 类的 getBasePlaceholder 方法访问形状占位符,并获取应用于页脚形状的动画效果,包括从布局和母版幻灯片上的占位符继承的效果。
$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);
// 获取普通幻灯片上形状的动画效果。
$shape = $slide->getShapes()->get_Item(0);
$shapeEffects = $slide->getTimeline()->getMainSequence()->getEffectsByShape($shape);
// 获取布局幻灯片上占位符的动画效果。
$layoutShape = $shape->getBasePlaceholder();
$layoutShapeEffects = $slide->getLayoutSlide()->getTimeline()->getMainSequence()->getEffectsByShape($layoutShape);
// 获取母版幻灯片上占位符的动画效果。
$masterShape = $layoutShape->getBasePlaceholder();
$masterShapeEffects = $slide->getLayoutSlide()->getMasterSlide()->getTimeline()->getMainSequence()->getEffectsByShape($masterShape);
echo "Main sequence of shape effects:" . PHP_EOL;
printEffects($masterShapeEffects);
printEffects($layoutShapeEffects);
printEffects($shapeEffects);
$presentation->dispose();
function printEffects($effects) {
foreach ($effects as $effect) {
echo "Type: " . $effect->getType() . ", subtype: " . $effect->getSubtype() . PHP_EOL;
}
}
Main sequence of shape effects:
Type: 47, subtype: 2 // 飞行, 底部
Type: 134, subtype: 45 // 拆分, 垂直进入
Type: 126, subtype: 22 // 随机条纹, 水平
更改动画效果计时方法
Aspose.Slides for PHP via Java 允许您更改动画效果的 Timing(计时)属性。
这是 Microsoft PowerPoint 中的动画计时窗格:

以下是 PowerPoint 计时与 Effect Timing 属性之间的对应关系:
- PowerPoint 计时 Start 下拉列表对应 Timing::getTriggerType 方法。
- PowerPoint 计时 Duration 对应 Timing::getDuration 方法。动画的持续时间(秒)是动画完成一次循环所需的总时间。
- PowerPoint 计时 Delay 对应 Timing::getTriggerDelayTime 方法。
以下是更改 Effect Timing(效果计时)属性的方法:
- Apply 或获取动画效果。
- 使用 Effect::getTiming 方法设置所需的新值。
- 保存修改后的 PPTX 文件。
下面的 PHP 代码演示此操作:
# 实例化一个表示演示文稿文件的 Presentation 类。
$pres = new Presentation("AnimExample_out.pptx");
try {
# 获取幻灯片的主序列。
$sequence = $pres->getSlides()->get_Item(0)->getTimeline()->getMainSequence();
# 获取主序列的第一个效果。
$effect = $sequence->get_Item(0);
# 将效果的 TriggerType 更改为单击时启动
$effect->getTiming()->setTriggerType(EffectTriggerType::OnClick);
# 更改效果的持续时间
$effect->getTiming()->setDuration(3.0);
# 更改效果的 TriggerDelayTime
$effect->getTiming()->setTriggerDelayTime(0.5);
# 将 PPTX 文件保存到磁盘
$pres->save("AnimExample_changed.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
动画效果声音
Aspose.Slides 提供以下方法,以便在动画效果中使用声音:
添加动画效果声音
下面的 PHP 代码演示如何添加动画效果声音,并在下一个效果开始时停止它:
$pres = new Presentation("AnimExample_out.pptx");
try {
# 将音频添加到演示文稿的音频集合
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = (new JavaClass("java.lang.Byte"))->TYPE;
try {
$dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "sampleaudio.wav"));
$bytes = $Array->newInstance($Byte, $dis->available());
$dis->readFully($bytes);
} finally {
if (!java_is_null($dis)) $dis->close();
}
$effectSound = $pres->getAudios()->addAudio($bytes);
$firstSlide = $pres->getSlides()->get_Item(0);
# 获取幻灯片的主序列。
$sequence = $firstSlide->getTimeline()->getMainSequence();
# 获取主序列的第一个效果。
$firstEffect = $sequence->get_Item(0);
# 检查效果是否为“无声音”。
if (java_is_null(!$firstEffect->getStopPreviousSound() && $firstEffect->getSound())) {
# 为第一个效果添加声音。
$firstEffect->setSound($effectSound);
}
# 获取幻灯片的第一个交互序列。
$interactiveSequence = $firstSlide->getTimeline()->getInteractiveSequences()->get_Item(0);
# 设置效果的“停止先前声音”标志。
$interactiveSequence->get_Item(0)->setStopPreviousSound(true);
# 将 PPTX 文件写入磁盘。
$pres->save("AnimExample_Sound_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
提取动画效果声音
- 创建 Presentation 类的实例。
- 通过索引获取幻灯片的引用。
- 获取主效果序列。
- 提取每个动画效果中嵌入的 setSound(IAudio value)。
下面的 PHP 代码演示如何提取嵌入在动画效果中的声音:
# 实例化一个表示演示文稿文件的 Presentation 类。
$presentation = new Presentation("EffectSound.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
# 获取幻灯片的主序列。
$sequence = $slide->getTimeline()->getMainSequence();
foreach($sequence as $effect) {
if (java_is_null($effect->getSound())) {
continue;
}
# 提取效果声音的字节数组
$audio = $effect->getSound()->getBinaryData();
}
} finally {
if (!java_is_null($presentation)) {
$presentation->dispose();
}
}
后续动画
Aspose.Slides for PHP via Java 允许您更改动画效果的 After animation(后续动画)属性。
这是 Microsoft PowerPoint 中的动画效果窗格和扩展菜单:

PowerPoint 效果 After animation 下拉列表对应以下方法:
- setAfterAnimationType(int value) 方法描述后续动画类型:
- PowerPoint More Colors 对应 AfterAnimationType::Color 类型;
- PowerPoint Don’t Dim 列表项对应 AfterAnimationType::DoNotDim 类型(默认后续动画类型);
- PowerPoint Hide After Animation 项对应 AfterAnimationType::HideAfterAnimation 类型;
- PowerPoint Hide on Next Mouse Click 项对应 AfterAnimationType::HideOnNextMouseClick 类型;
- setAfterAnimationColor(IColorFormat value) 方法定义后续动画的颜色格式。此方法与 AfterAnimationType::Color 类型配合使用。如果将类型更改为其他类型,后续动画颜色将被清除。
下面的 PHP 代码演示如何更改后续动画效果:
# 实例化一个表示演示文稿文件的 Presentation 类
$pres = new Presentation("AnimImage_out.pptx");
try {
$firstSlide = $pres->getSlides()->get_Item(0);
# 获取主序列的第一个效果
$firstEffect = $firstSlide->getTimeline()->getMainSequence()->get_Item(0);
# 将后续动画类型更改为颜色
$firstEffect->setAfterAnimationType(AfterAnimationType::Color);
# 设置后续动画的暗淡颜色
$firstEffect->getAfterAnimationColor()->setColor(java("java.awt.Color")->BLUE);
# 将 PPTX 文件写入磁盘
$pres->save("AnimImage_AfterAnimation.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
文本动画
Aspose.Slides 提供以下方法,以便在动画效果的 Animate text(动画文本)块中工作:
- setAnimateTextType(int value) 方法描述效果的动画文本类型。形状文本可以被动画化:
- 全部一次性 (AnimateTextType::AllAtOnce 类型)
- 按词 (AnimateTextType::ByWord 类型)
- 按字母 (AnimateTextType::ByLetter 类型)
- setDelayBetweenTextParts(float value) 方法设置动画文本部分(词或字母)之间的延迟。正值指定效果持续时间的百分比,负值指定秒数延迟。
以下是更改 Effect Animate text(效果动画文本)属性的方法:
- Apply 或获取动画效果。
- 使用 setBuildType(int value) 方法和 BuildType::AsOneObject 值以关闭 By Paragraphs 动画模式。
- 使用 setAnimateTextType(int value) 和 setDelayBetweenTextParts(float value) 方法设置新值。
- 保存修改后的 PPTX 文件。
下面的 PHP 代码演示此操作:
# 实例化一个表示演示文稿文件的 Presentation 类。
$pres = new Presentation("AnimTextBox_out.pptx");
try {
$firstSlide = $pres->getSlides()->get_Item(0);
# 获取主序列的第一个效果
$firstEffect = $firstSlide->getTimeline()->getMainSequence()->get_Item(0);
# 将效果的文本动画类型更改为 "As One Object"
$firstEffect->getTextAnimation()->setBuildType(BuildType::AsOneObject);
# 将效果的动画文本类型更改为 "By word"
$firstEffect->setAnimateTextType(AnimateTextType::ByWord);
# 将单词之间的延迟设置为效果持续时间的 20%
$firstEffect->setDelayBetweenTextParts(20.0);
# 将 PPTX 文件写入磁盘
$pres->save("AnimTextBox_AnimateText.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
常见问题
如何确保在将演示文稿发布到网页时保留动画?
Export to HTML5 并启用负责 shape 和 transition 动画的 options 。普通 HTML 不会播放幻灯片动画,而 HTML5 会。
更改形状的 Z 顺序(层次顺序)会如何影响动画?
动画顺序和绘制顺序相互独立:效果控制出现/消失的时间和类型,而 z-order 决定哪些覆盖哪些。可见结果由两者的组合决定。(这是 PowerPoint 的通用行为,Aspose.Slides 的效果和形状模型遵循相同的逻辑。)
将动画转换为视频时,某些效果是否存在限制?
一般来说,动画受支持,但在少数情况下或特定效果可能呈现不同。建议使用您所用的效果和库版本进行测试。