在簡報中使用 PHP 套用形狀動畫

簡介

動畫是可以套用到文字、圖像、形狀或圖表的視覺效果。它們為簡報或其組成部分賦予活力。

為何在簡報中使用動畫?

使用動畫,您可以

  • 控制資訊的流向
  • 強調重要要點
  • 提升觀眾的興趣或參與度
  • 讓內容更易閱讀、同化或處理
  • 吸引讀者或觀眾注意簡報中的重要部份

PowerPoint 提供了大量選項與工具,用於 進場退場強調移動路徑類別的動畫與動畫效果。

Aspose.Slides 中的動畫

  • Aspose.Slides 在 Aspose.Slides.Animation 命名空間下提供您處理動畫所需的類別與型別,
  • Aspose.Slides 在 EffectType 列舉中提供超過 150 個動畫效果。這些效果本質上與 PowerPoint 中使用的效果相同(或等效)。

將動畫套用至文字方塊

Aspose.Slides for PHP via Java 允許您將動畫套用至形狀中的文字。

  1. 建立 Presentation 類別的實例。
  2. 透過索引取得投影片的參考。
  3. 加入一個矩形 AutoShape
  4. 將文字加入 AutoShapeTextFrame
  5. 取得主要的效果序列。
  6. 將動畫效果加入 AutoShape
  7. 使用 TextAnimation.setBuildType 方法,並使用 BuildType 列舉中的值。
  8. 將簡報寫入磁碟,儲存為 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();
    # 為形狀新增 Fade 動畫效果
    $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();
    }
  }

將動畫套用至圖片框架

  1. 建立 Presentation 類別的實例。
  2. 透過索引取得投影片的參考。
  3. 在投影片上新增或取得 PictureFrame
  4. 取得主要的效果序列。
  5. 將動畫效果加入 PictureFrame
  6. 將簡報寫入磁碟,儲存為 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();
    # 為圖片框架新增 From Left 飛入動畫效果
    $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();
    }
  }

將動畫套用至形狀

  1. 建立 the Presentation 類別的實例。
  2. 透過索引取得投影片的參考。
  3. 加入一個矩形 AutoShape
  4. 加入一個斜角 AutoShape(當此物件被點擊時,動畫會播放)。
  5. 在斜角形狀上建立效果序列。
  6. 建立自訂的 UserPath
  7. 新增移動至 UserPath 的指令。
  8. 將簡報寫入磁碟,儲存為 PPTX 檔案。

以下 PHP 程式碼示範如何將 PathFootball(path football)效果套用至形狀:

  # 建立代表 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 效果。

Slide shape animation effect

再假設在 layout 投影片的頁腳占位區套用了 Split 效果。

Layout shape animation effect

最後,Fly In 效果套用於 master 投影片的頁腳占位區。

Master shape animation effect

以下範例程式碼示範如何使用 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;
    }
}

Output:

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 中的 Animation Timing 面板:

example1_image

以下是 PowerPoint Timing 與 Effect Timing 屬性之對應關係:

以下說明如何變更 Effect Timing 屬性:

  1. 套用或取得動畫效果。
  2. 使用 Effect::getTiming 方法設定您需要的新值。
  3. 儲存已修改的 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);
    # 更改效果的 Duration
    $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();
    }
  }

擷取動畫效果音效

  1. 建立 Presentation 類別的實例。
  2. 透過索引取得投影片的參考。
  3. 取得主要的效果序列。
  4. 擷取每個動畫效果中嵌入的 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 中的 Animation Effect 面板與延伸功能表:

example1_image

PowerPoint Effect After animation 下拉選單對應以下方法:

以下 PHP 程式碼示範如何變更 after animation 效果:

  # 建立代表簡報檔案的 Presentation 類別實例
  $pres = new Presentation("AnimImage_out.pptx");
  try {
    $firstSlide = $pres->getSlides()->get_Item(0);
    # 取得主要序列的第一個效果
    $firstEffect = $firstSlide->getTimeline()->getMainSequence()->get_Item(0);
    # 將 after animation 類型變更為 Color
    $firstEffect->setAfterAnimationType(AfterAnimationType::Color);
    # 設定 after animation 暗淡顏色
    $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 區塊中工作:

以下說明如何變更 Effect Animate text 屬性:

  1. 套用或取得動畫效果。
  2. 使用 setBuildType(int value) 方法與 BuildType::AsOneObject 值,關閉 By Paragraphs 動畫模式。
  3. 使用 setAnimateTextType(int value)setDelayBetweenTextParts(float value) 方法設定新值。
  4. 儲存已修改的 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 並啟用負責 shapetransition 動畫的 options。純 HTML 不會播放投影片動畫,HTML5 則會。

變更形狀的 Z 軸順序(圖層順序)如何影響動畫?

動畫與繪製順序是獨立的:效果控制出現/消失的時間與類型,而 z-order 決定何者覆蓋何者。最終可見結果由兩者組合決定。(這是一般 PowerPoint 的行為;Aspose.Slides 的效果與形狀模型遵循相同邏輯。)

在將動畫轉換為影片時,某些效果是否有限制?

一般而言,動畫受到支援,但在少數情況或特定效果可能會有不同的呈現方式。建議使用您所使用的效果與相應的函式庫版本進行測試。