สร้างและแก้ไขพฤติกรรมแอนิเมชันแบบกำหนดเองใน PHP

ภาพรวม

พฤติกรรมแอนิเมชันที่กำหนดเองช่วยให้คุณควบคุมการทำงานแต่ละอย่างภายในเอฟเฟกต์แอนิเมชัน เช่น การเปลี่ยนสี การหมุนรูปทรง หรือการตามเส้นทางการเคลื่อนที่ที่สามารถแก้ไขได้ คำแนะนำนี้แสดงวิธีสร้างและรวมพฤติกรรม ตั้งค่าการกำหนดเวลา ตรวจสอบและแก้ไขแอนิเมชันที่มีอยู่ และตรวจสอบว่าคุณสมบัติเหล่านั้นคงอยู่หลังจากบันทึกและเปิดงานนำเสนอใหม่

สำหรับเอฟเฟกต์ที่กำหนดล่วงหน้าและทริกเกอร์คลิก ดูที่ Shape Animation

ทำความเข้าใจโมเดลแอนิเมชัน

แอนิเมชันจัดเป็น Timeline → Sequence → Effect → Behaviors:

  • แต่ละสไลด์มีไทม์ไลน์ที่บรรจุซีเควนซ์หลักและซีเควนซ์เชิงโต้ตอบ
  • A Sequence มีเอฟเฟกต์ ซึ่งอาจกำหนดเป้าหมายไปยังรูปร่างต่าง ๆ
  • A Effect ระบุรูปร่างเป้าหมาย พรีเซ็ต ชนิดย่อย และการกำหนดเวลาของเอฟเฟกต์
  • คอลเลกชันที่คืนค่าจาก Effect::getBehaviors ประกอบด้วยการทำงานที่ทำให้เอฟเฟกต์เกิดขึ้น เช่น การเปลี่ยนสี การย้าย การหมุน การตั้งค่าคุณสมบัติ ฯลฯ

สร้างพฤติกรรมแต่ละรายการ

เรียก Sequence::addEffect เพื่อสร้างเอฟเฟกต์และเข้าถึงคอลเลกชัน getBehaviors พรีเซ็ตสามารถเติมคอลเลกชันนี้โดยอัตโนมัติ ให้คงการทำงานของพรีเซ็ตไว้เมื่อต่อเติม หรือใช้ clear เมื่อจงใจแทนที่ทั้งหมด

BehaviorFactory สร้างพฤติกรรมแปดประเภทตามตัวอย่างด้านล่าง การเคลื่อนที่อธิบายไว้ใน Build a Motion Path ตัวอย่างโค้ดแต่ละส่วนรวมการนำเข้าและสมมติว่า PHP/Java Bridge และไลบรารี Aspose.Slides PHP ได้ถูกโหลดแล้ว ตัวอย่างการแก้ไขต่อมาจะระบุไฟล์ผลลัพธ์ที่ใช้

การหมุน

ใช้ createRotationEffect เพื่อสร้างการหมุน getBy ระบุมุมสัมพัทธ์เป็นองศา; getFrom และ getTo ระบุจุดสิ้นสุด

ตัวอย่างเริ่มด้วยเอฟเฟกต์ Spin แทนที่การทำงานของพรีเซ็ตด้วยพฤติกรรมการหมุนหนึ่งรายการและกำหนดระยะเวลาเป็นสองวินาที มุมสัมพัทธ์ 90 องศาแสดงการหมุนหนึ่งไตรมาสจากทิศทางเริ่มต้นของรูปทรง ดังนั้นไม่จำเป็นต้องระบุมุมเริ่มต้นอย่างชัดเจน

use aspose\slides\BehaviorFactory;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::Spin, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $rotation = $factory->createRotationEffect();
    $rotation->setBy(90);
    $rotation->getTiming()->setDuration(2);

    $effect->getBehaviors()->add($rotation);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "rotation.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

rotation.pptx มีรูปทรงหนึ่งรูปและพฤติกรรมการหมุนหนึ่งรายการ คอลเลกชัน เวลา และตัวอย่างการแก้ไขการหมุนด้านล่างใช้ไฟล์นี้

การปรับขนาด

ใช้ createScaleEffect พร้อมเปอร์เซ็นต์ X/Y: getFrom และ getTo บรรยายขนาดเริ่มต้นและขนาดสุดท้าย ส่วน getBy บรรยายการเปลี่ยนแปลงสัมพัทธ์ ที่นี่ 100 หมายถึงขนาดต้นฉบับ

ตัวอย่างเพิ่มขนาดทั้งสองมิติจาก 100 % ไปเป็น 125 % ภายในสองวินาที การใช้เปอร์เซ็นต์แนวนอนและแนวตั้งเท่ากันจะคงอัตราส่วนของรูปทรงไว้; เปอร์เซ็นต์ที่ต่างกันจะยืดมิติก่อหนึ่งมากกว่าก่ออื่น

use aspose\slides\BehaviorFactory;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\Point2DFloat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::GrowShrink, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $scale = $factory->createScaleEffect();
    $initialSize = new Point2DFloat(100, 100);
    $scale->setFrom($initialSize);
    $targetSize = new Point2DFloat(125, 125);
    $scale->setTo($targetSize);
    $scale->getTiming()->setDuration(2);

    $effect->getBehaviors()->add($scale);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "scale.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

สี

ใช้ createColorEffect เพื่อเปลี่ยนสีเติมจากสีน้ำเงินเป็นสีส้ม getFrom และ getTo เป็นสี; getBy เป็นออฟเซ็ตสี คอลเลกชัน BehaviorPropertyCollection ของพฤติกรรมบ่งบอกแอตทริบิวต์ที่กำลังทำแอนิเมชัน

การเติมเต็มแบบสีทึบของรูปทรงเริ่มต้นเป็นสีน้ำเงิน ซึ่งตรงกับสีเริ่มต้นของแอนิเมชัน การเลือกแอตทริบิวต์สีเติมทำให้พฤติกรรมรู้ว่าต้องเปลี่ยนส่วนใดของรูป; จุดสิ้นสุดของสีเพียงอย่างเดียวไม่บ่งบอกแอตทริบิวต์นั้น เอฟเฟกต์ที่บันทึกบรรยายการเปลี่ยนเป็นสีส้มในสองวินาที

use aspose\slides\BehaviorFactory;
use aspose\slides\BehaviorProperty;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$blue = new Java("java.awt.Color", 0, 0, 255);

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);
    $shape->getFillFormat()->setFillType(FillType::Solid);
    $shape->getFillFormat()->getSolidFillColor()->setColor($blue);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::ChangeFillColor, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $color = $factory->createColorEffect();
    $color->getProperties()->add(BehaviorProperty::getFillColor()->getValue());
    $color->getFrom()->setColor($blue);
    $orange = new Java("java.awt.Color", 255, 165, 0);
    $color->getTo()->setColor($orange);
    $color->getTiming()->setDuration(2);

    $effect->getBehaviors()->add($color);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "color.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

ฟิลเตอร์

ใช้ createFilterEffect เพื่อเลือกการลบล้าง getType, getSubtype, และ getReveal ระบุฟิลเตอร์, ทิศทาง, และว่าจะเปิดเผยหรือซ่อนรูป

ตัวอย่างนี้ตั้งค่าการลบล้างสองวินาทีที่เปิดเผยรูปโดยใช้ชนิดย่อยที่มาทางขวา การตั้งค่าฟิลเตอร์เป็นของพฤติกรรมภายในเอฟเฟกต์ ดังนั้นจึงทำหลังจากลบการทำงานดั้งเดิมของพรีเซ็ตออกแล้ว

use aspose\slides\BehaviorFactory;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\FilterEffectRevealType;
use aspose\slides\FilterEffectSubtype;
use aspose\slides\FilterEffectType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::Wipe, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $filter = $factory->createFilterEffect();
    $filter->setType(FilterEffectType::Wipe);
    $filter->setSubtype(FilterEffectSubtype::Right);
    $filter->setReveal(FilterEffectRevealType::In);
    $filter->getTiming()->setDuration(2);

    $effect->getBehaviors()->add($filter);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "filter.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

คุณสมบัติ

ใช้ createPropertyEffect เพื่อทำแอนิเมชันความทึบ getFrom, getTo, และ getBy เป็นสตริงที่ตีความด้วย getValueType และ getCalcMode เลือกจุดสิ้นสุดหรือออฟเซ็ตสัมพัทธ์แทนการตั้งค่าทั้งสามพร้อมกัน

ที่นี่แอตทริบิวต์ที่เลือกคือ opacity และสตริงตัวเลขแสดงการเปลี่ยนจากความทึบ 25 % ไปเป็นความทึบเต็มค่า การประมาณเชิงเส้นอธิบายการเปลี่ยนแปลงอย่างค่อยเป็นค่อยไประหว่างค่าทั้งสอง เมื่อปรับตัวอย่างนี้ไปใช้แอตทริบิวต์อื่น ให้เลือกประเภทค่าและค่าจุดสิ้นสุดที่เหมาะสมกับแอตทริบิวต์นั้น

use aspose\slides\BehaviorFactory;
use aspose\slides\BehaviorProperty;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\Presentation;
use aspose\slides\PropertyCalcModeType;
use aspose\slides\PropertyValueType;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::Fade, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $property = $factory->createPropertyEffect();
    $property->getProperties()->add(BehaviorProperty::getStyleOpacity()->getValue());
    $property->setValueType(PropertyValueType::Number);
    $property->setCalcMode(PropertyCalcModeType::Linear);
    $property->setFrom("0.25");
    $property->setTo("1");
    $property->getTiming()->setDuration(2);

    $effect->getBehaviors()->add($property);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "property.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

ตั้งค่า

ใช้ createSetEffect เพื่อกำหนดความมองเห็นผ่าน getTo พฤติกรรม set ไม่ทำการอินเทอร์โพเลตระหว่างจุดสิ้นสุด

ตัวอย่างเลือกแอตทริบิวต์ความมองเห็นและกำหนดสตริง visible เมื่อพฤติกรรมทำงาน สี่เหลี่ยมผืนผ้าถูกตั้งให้มองเห็นอยู่แล้วในงานนำเสนอขั้นต่ำนี้ ดังนั้นการกำหนดอาจไม่แสดงการเปลี่ยนแปลงที่ชัดเจน การทำเช่นนี้เป็นประโยชน์เมื่อเป็นส่วนหนึ่งของเอฟเฟกต์ที่ใหญ่กว่า ซึ่งควบคุมว่ารูปร่างจะซ่อนหรือแสดงเมื่อใด

use aspose\slides\BehaviorFactory;
use aspose\slides\BehaviorProperty;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::Appear, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $set = $factory->createSetEffect();
    $set->getProperties()->add(BehaviorProperty::getStyleVisibility()->getValue());
    $set->setTo("visible");

    $effect->getBehaviors()->add($set);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "set.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

คำสั่ง

ใช้ createCommandEffect และตั้งค่า getType, getCommandString, และ getShapeTarget ใส่ไฟล์บันทึกเสียง WAV ชื่อ sample.wav ลงในไดเรกทอรีทำงาน ตัวอย่างนี้ฝังไฟล์ด้วย addAudioFrameEmbedded และแนบคำสั่งเล่นไปกับเฟรมเสียง

เฟรมเสียงเป็นทั้งเป้าหมายของเอฟเฟกต์และของคำสั่ง การเชื่อมนี้ทำให้คำสั่งเล่นอ้างอิงไปยังไฟล์บันทึกที่ฝังไว้; สตริงคำสั่งโดยลำพังไม่บ่งบอกวัตถุสื่อใดที่จะควบคุม เอฟเฟกต์ตั้งค่าให้เริ่มเมื่อคลิกระหว่างการแสดงสไลด์

use aspose\slides\BehaviorFactory;
use aspose\slides\CommandEffectType;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $audioPath = $baseDirectory . DIRECTORY_SEPARATOR . "sample.wav";
    $audioStream = new Java("java.io.FileInputStream", $audioPath);
    try {
        $audioFrame = $slide->getShapes()->addAudioFrameEmbedded(100, 100, 40, 40, $audioStream);

        $effect = $slide->getTimeline()->getMainSequence()->addEffect($audioFrame, EffectType::MediaPlay, EffectSubtype::None, EffectTriggerType::OnClick);
        $effect->getBehaviors()->clear();

        $factory = new BehaviorFactory();
        $command = $factory->createCommandEffect();
        $command->setType(CommandEffectType::Call);
        $command->setCommandString("play");
        $command->setShapeTarget($audioFrame);

        $effect->getBehaviors()->add($command);

        $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "command.pptx", SaveFormat::Pptx);
    } finally {
        $audioStream->close();
    }
} finally {
    $presentation->dispose();
}

Saving stores the command in command.pptx; it does not play the recording. Playback requires a slideshow player that supports the command and its media target.

จัดการคอลเลกชันพฤติกรรม

BehaviorCollection รองรับ add, insert, remove, และ removeAt. ตัวอย่างนี้เปิด rotation.pptx เพิ่มการปรับขนาด ย้ายมันก่อนการหมุน และลบการหมุนออก การลบและแทรกซ้ำวัตถุเดียวกันทำให้ตำแหน่งที่เก็บเปลี่ยนโดยไม่ต้องสร้างสำเนาใหม่

การแก้ไขลำดับทำให้คอลเลกชันเปลี่ยนจาก rotation–scale เป็น scale–rotation แล้วเป็น scale เท่านั้น ดัชนีอ้างอิงคอลเลกชันปัจจุบัน ดังนั้นการลบใช้ดัชนีใหม่ของการหมุนหลังจากจัดเรียงใหม่ การนับครั้งสุดท้ายยืนยันว่าพฤติกรรมใดจะถูกบันทึก

use aspose\slides\BehaviorFactory;
use aspose\slides\Point2DFloat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "rotation.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);
    $behaviors = $effect->getBehaviors();

    $factory = new BehaviorFactory();
    $scale = $factory->createScaleEffect();
    $targetSize = new Point2DFloat(125, 125);
    $scale->setTo($targetSize);
    $scale->getTiming()->setDuration(2);

    $behaviors->add($scale);

    $behaviors->remove($scale);
    $behaviors->insert(0, $scale);
    $behaviors->removeAt(1);

    $behaviorCount = java_values($behaviors->getCount());
    for ($i = 0; $i < $behaviorCount; $i++) {
        $behavior = $behaviors->get_Item($i);
        echo java_values($behavior->getClass()->getSimpleName()) . PHP_EOL;
    }

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "collection-edited.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

ผลลัพธ์คือ ScaleEffect: เหลือการปรับขนาดอย่างเดียว คำสั่งเรียงลำดับของคอลเลกชันไม่ได้โดยอัตโนมัติจัดเวลาให้ทำงานต่อเนื่อง ให้ใช้ clear เฉพาะเมื่อแทนที่การทำงานทั้งหมด

ตั้งค่าการกำหนดเวลาพฤติกรรม

พฤติกรรมมี Timing ของตัวเอง แยกจากการกำหนดเวลาที่ได้รับจาก Effect::getTiming การกำหนดเวลาเอฟเฟกต์จัดตารางให้เอฟเฟกต์โดยรวม; การกำหนดเวลาพฤติกรรมอธิบายการทำงานภายในเอฟเฟกต์นั้น

กำหนดระยะเวลา, การหน่วง, การทำซ้ำ, และการเร่ง

เปิด rotation.pptx และตั้งระยะเวลา (getDuration) และการหน่วงทริกเกอร์ (getTriggerDelayTime) เป็นวินาที แล้วกำหนดจำนวนครั้งทำซ้ำด้วย setRepeatCount getAccelerate และ getDecelerate เป็นส่วนของระยะเวลา; ให้ผลรวมไม่เกิน 1

ไฟล์อินพุตคือไฟล์ที่สร้างในตัวอย่างการหมุน ซึ่งพฤติกรรมแรกเป็นการหมุน ตัวอย่างนี้เปลี่ยนแค่การกำหนดเวลาของพฤติกรรมนั้น; มุม 90 ° ยังคงเดิม การแยกมุมและเวลาช่วยให้ปรับความเร็วได้โดยไม่ต้องสร้างเอฟเฟกต์ใหม่

use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "rotation.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);

    $rotation = $effect->getBehaviors()->get_Item(0);
    $rotation->getTiming()->setDuration(2);
    $rotation->getTiming()->setTriggerDelayTime(0.5);
    $rotation->getTiming()->setRepeatCount(3);
    $rotation->getTiming()->setAccelerate(0.2);
    $rotation->getTiming()->setDecelerate(0.2);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "timing.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

พฤติกรรมใช้ระยะเวลา 2 วินาที หน่วง 0.5 วินาที และทำซ้ำ 3 ครั้ง 20 % แรกและสุดของระยะเวลาถูกใช้สำหรับการเร่งและการชะลอ

นโยบายทำซ้ำอื่น ๆ ได้แก่ getRepeatDuration, getRepeatUntilEndSlide, และ getRepeatUntilNextClick ให้เลือกนโยบายหนึ่งแทนการเปิดใช้งานทั้งหมดพร้อมกัน getAutoReverse เล่นแอนิเมชันย้อนกลับหลังการทำงานไปข้างหน้า การเร่งและการชะลอใช้กับการเปลี่ยนแปลงต่อเนื่อง ไม่ใช่การกำหนดค่าแบบกระโดดหรือคำสั่ง

สร้างเส้นทางการเคลื่อนที่

ใช้ createMotionEffect เพื่อสร้างการเคลื่อนที่ ส่วน getFrom, getTo, และ getBy บรรยายพิกัดหรือออฟเซ็ตตามเปอร์เซ็นต์ สำหรับเส้นทางที่แก้ไขได้ ให้สร้าง MotionPath แล้วกำหนดด้วย MotionEffect::setPath MotionPath จะเก็บคำสั่งเส้นทาง

MotionCommandPathType เลือกการดำเนินการ:

คำสั่ง จุด ความหมาย
MoveTo One Set the starting position.
LineTo One Move along a straight segment to its endpoint.
CurveTo Three Follow a cubic curve defined by two control points and an endpoint.
CloseLoop None Return to the starting position.
End None Finish the path.

MotionPathPointsType บรรยายคุณลักษณะการแก้ไขจุด เช่น จุดมุมหรือจุดเรียบ ไม่ได้แทนที่ประเภทคำสั่ง ใช้ประเภทจุดแบบ curve สำหรับตัวอย่างเส้นโค้งด้านล่าง และประเภทจุดแบบ corner สำหรับส่วนตรง

พิกัดของเส้นทางปกติกับขนาดสไลด์: การเคลื่อนที่ X 0.25 หมายถึงหนึ่งในสี่ของความกว้างสไลด์ ไม่ใช่ 0.25 พิกเซล Y บวกหมายถึงลงล่าง คำสั่ง absolute ระบุตำแหน่งในระบบพิกัดของเส้นทาง; คำสั่ง relative ระบุออฟเซ็ตจากตำแหน่งปัจจุบัน สิ่งนี้แยกจาก getOrigin ที่เลือกกรอบอ้างอิงของเส้นทาง และ getPathEditMode ที่ควบคุมการเคลื่อนที่ของเส้นทางเมื่อย้ายรูป

สร้างเส้นทางตรง

สร้างพฤติกรรมการเคลื่อนที่ด้วยจุดเริ่มต้น ส่วนตรงหนึ่งส่วน และคำสั่งจบ MotionPath::add รับประเภทคำสั่ง, จุด, ประเภทจุด, และแฟล็กพิกัดสัมพัทธ์

คำสั่งเริ่มต้นกำหนด (0, 0) และเส้นตรงจบที่ (0.25, 0) ทำให้เส้นทางเคลื่อนที่แนวนอนหนึ่งในสี่ของความกว้างสไลท์ คำสั่งจบไม่มีจุดพิกัด เมื่อเส้นทางถูกกำหนด การเพิ่มพฤติกรรมการเคลื่อนที่เข้าไปในเอฟเฟกต์จะเชื่อมเส้นทางนั้นกับสี่เหลี่ยมผืนผ้า

use aspose\slides\BehaviorFactory;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectType;
use aspose\slides\MotionCommandPathType;
use aspose\slides\MotionOriginType;
use aspose\slides\MotionPath;
use aspose\slides\MotionPathPointsType;
use aspose\slides\Point2DFloat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\ShapeType;

$baseDirectory = getcwd();

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);

    $shape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

    $effect = $slide->getTimeline()->getMainSequence()->addEffect($shape, EffectType::PathRight, EffectSubtype::None, EffectTriggerType::OnClick);
    $effect->getBehaviors()->clear();

    $factory = new BehaviorFactory();
    $motion = $factory->createMotionEffect();
    $motion->setOrigin(MotionOriginType::Layout);
    $motion->getTiming()->setDuration(2);

    $path = new MotionPath();
    $startPoints = [new Point2DFloat(0, 0)];
    $path->add(MotionCommandPathType::MoveTo, $startPoints, MotionPathPointsType::Auto, false);
    $endPoints = [new Point2DFloat(0.25, 0)];
    $path->add(MotionCommandPathType::LineTo, $endPoints, MotionPathPointsType::Corner, false);
    $path->add(MotionCommandPathType::End, [], MotionPathPointsType::None, false);

    $motion->setPath($path);
    $effect->getBehaviors()->add($motion);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "motion.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

motion.pptx มีพฤติกรรมการเคลื่อนที่หนึ่งรายการพร้อมสามคำสั่งเส้นทาง ตัวอย่างการแก้ไขไฟล์ต่อไปนี้ใช้โครงสร้างที่รู้จักนี้

เปรียบเทียบพิกัด Absolute กับ Relative

วัตถุสองอันนี้อธิบายเส้นทางเดียวกัน คำสั่ง absolute จบที่ (0.3, 0.1) คำสั่ง relative เพิ่ม (0.1, 0.1) ไปยังตำแหน่งปัจจุบัน (0.2, 0)

ทั้งสองเส้นทางเริ่มจากตำแหน่งเดียวกัน สำหรับเส้น relative ให้นำออฟเซ็ต X และ Y ไปบวกกับตำแหน่งปัจจุบันเพื่อได้จุดสิ้นสุด; ส่วนเส้น absolute อ่านจุดสิ้นสุดโดยตรง การสลับแฟล็กโดยไม่แปลงพิกัดจะทำให้เส้นทางแตกต่างกัน

use aspose\slides\MotionCommandPathType;
use aspose\slides\MotionPath;
use aspose\slides\MotionPathPointsType;
use aspose\slides\Point2DFloat;

$absolutePath = new MotionPath();
$absoluteStart = [new Point2DFloat(0.2, 0)];
$absolutePath->add(MotionCommandPathType::MoveTo, $absoluteStart, MotionPathPointsType::Auto, false);
$absoluteEnd = [new Point2DFloat(0.3, 0.1)];
$absolutePath->add(MotionCommandPathType::LineTo, $absoluteEnd, MotionPathPointsType::Corner, false);

$relativePath = new MotionPath();
$relativeStart = [new Point2DFloat(0.2, 0)];
$relativePath->add(MotionCommandPathType::MoveTo, $relativeStart, MotionPathPointsType::Auto, false);
$relativeOffset = [new Point2DFloat(0.1, 0.1)];
$relativePath->add(MotionCommandPathType::LineTo, $relativeOffset, MotionPathPointsType::Corner, true);

กำหนดเส้นทางใดเส้นทางหนึ่งให้กับพฤติกรรมการเคลื่อนที่เพื่อใช้ในงานนำเสนอ ค่าบูลีนสุดท้ายเลือกพิกัด relative สำหรับคำสั่งนั้น

แทนที่เส้นตรงด้วยโค้ง

เปิด motion.pptx และแทนที่คำสั่งเส้นตรงด้วยโค้งแบบคิวบิก ให้ใส่จุดควบคุมสองจุดก่อน แล้วตามด้วยจุดสิ้นสุด

ตำแหน่งเริ่มต้นมาจากคำสั่งก่อนหน้า จุดสองจุดแรกกำหนดรูปโค้ง ส่วนจุดที่สามคือปลายทาง; ไม่ใช่สามจุดต่อเนื่อง การอัปเดตประเภทคำสั่ง ประเภทการแก้ไขจุด และอาเรย์จุดพร้อมกันทำให้ส่วนเส้นตรงสอดคล้องกับเรขาคณิตใหม่

use aspose\slides\MotionCommandPathType;
use aspose\slides\MotionPathPointsType;
use aspose\slides\Point2DFloat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "motion.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);
    $motion = $effect->getBehaviors()->get_Item(0);

    $path = $motion->getPath();
    $path->get_Item(1)->setCommandType(MotionCommandPathType::CurveTo);
    $path->get_Item(1)->setPointsType(MotionPathPointsType::CurveSmooth);
    $curvePoints = [new Point2DFloat(0.1, 0), new Point2DFloat(0.2, 0.1), new Point2DFloat(0.3, 0.1)];
    $path->get_Item(1)->setPoints($curvePoints);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "curve.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

เส้นทางใน curve.pptx ยังมีสามคำสั่ง; คำสั่งกลางตอนนี้เป็นโค้ง

ตรวจสอบและแก้ไขเส้นทางที่บันทึกไว้

แต่ละ MotionCmdPath เปิดเผย getPoints, getCommandType, getPointsType, และ isRelative. ตัวอย่างต่อไปนี้ใช้เส้นทางสามคำสั่งที่รู้จักใน motion.pptx. สำหรับอินพุตที่ไม่กำหนดไว้ล่วงหน้า ให้ค้นหาเอฟเฟกต์ที่ต้องการและตรวจสอบประเภทคำสั่งและจำนวนจุดก่อนแก้ไขตามดัชนี

อ่านคำสั่งและพิกัด

อ่านเส้นทางโดยไม่เปลี่ยนแปลง คำสั่ง end และ close-loop ไม่ต้องการจุด จึงต้องรองรับอาเรย์จุดเป็น null

ผลลัพธ์จะแสดงคู่ประเภทคำสั่งตัวเลขกับแฟล็กพิกัด relative ก่อนรายการจุด ช่วยให้คุณแยกจุดสิ้นสุดจากออฟเซ็ตก่อนแก้ไขเส้นทาง โค้งจะแสดงสามจุด ส่วนเส้นตรงในไฟล์นี้จะแสดงเพียงหนึ่งจุด

use aspose\slides\Presentation;

$baseDirectory = getcwd();

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "motion.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);
    $motion = $effect->getBehaviors()->get_Item(0);

    $path = $motion->getPath();
    $commandCount = java_values($path->getCount());
    for ($i = 0; $i < $commandCount; $i++) {
        $segment = $path->get_Item($i);
        $commandType = java_values($segment->getCommandType());
        $relative = java_values($segment->isRelative()) ? "true" : "false";
        echo $commandType . ", relative: " . $relative . PHP_EOL;
        $points = $segment->getPoints();
        if (!java_is_null($points)) {
            foreach ($points as $point) {
                echo "X=" . java_values($point->getX()) . ", Y=" . java_values($point->getY()) . PHP_EOL;
            }
        }
    }
} finally {
    $presentation->dispose();
}

รายการประกอบด้วยจุดเริ่มต้น เส้น absolute สิ้นสุดที่ (0.25, 0) และคำสั่ง end

เปลี่ยนจุดสิ้นสุด

เปิด motion.pptx แล้วแทนที่อาเรย์จุดของเส้นเพื่อย้ายจุดสิ้นสุด

ในไฟล์อินพุต ดัชนี 0 คือคำสั่งเริ่มต้น ดัชนี 1 คือเส้น การแทนที่จุดเดียวของเส้นทำให้ปลายทางเปลี่ยนโดยไม่กระทบประเภทคำสั่ง เวลา หรือตำแหน่งในคอลเลกชัน เนื่องจากคำสั่งใช้พิกัด absolute คู่ใหม่ระบุตำแหน่งแทนออฟเซ็ตที่เพิ่ม

use aspose\slides\Point2DFloat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "motion.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);

    $motion = $effect->getBehaviors()->get_Item(0);
    $endPoints = [new Point2DFloat(0.4, 0.1)];
    $motion->getPath()->get_Item(1)->setPoints($endPoints);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "motion-endpoint.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

เส้นใน motion-endpoint.pptx สิ้นสุดที่ (0.4, 0.1); ไฟล์ต้นฉบับไม่เปลี่ยนแปลง

แทนที่ส่วนเส้น

ใช้ insert และ removeAt เพื่อแทนที่เส้นใน motion.pptx. การแทรกทำให้เส้นเก่าลำดับที่ 2

ตัวอย่างนี้แสดงการแทนที่วัตถุคำสั่งแทนการแก้ไขพิกัดเดิม หลังการแทรก คอลเลกชันชั่วคราวมีคำสั่งเริ่มต้น, เส้นใหม่, เส้นเก่า, คำสั่ง end การลบดัชนี 2 จะทิ้งเส้นเก่าและเหลือเส้นใหม่ในที่เดิม

use aspose\slides\MotionCommandPathType;
use aspose\slides\MotionPathPointsType;
use aspose\slides\Point2DFloat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "motion.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);
    $motion = $effect->getBehaviors()->get_Item(0);

    $path = $motion->getPath();
    $replacementPoints = [new Point2DFloat(0.2, 0.1)];
    $path->insert(1, MotionCommandPathType::LineTo, $replacementPoints, MotionPathPointsType::Corner, false);
    $path->removeAt(2);

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "motion-edited.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

เส้นทางที่บันทึกยังคงมีสามคำสั่ง โดยเส้นใหม่สิ้นสุดที่ (0.2, 0.1) และคำสั่ง end อยู่ตำแหน่งสุดท้าย

แก้ไขและตรวจสอบพฤติกรรมที่มีอยู่

เมื่อไม่ทราบดัชนีพฤติกรรม ให้เลือกตามประเภท ตัวอย่างนี้เปิด rotation.pptx, ค้นหา RotationEffect, เปลี่ยนมุม, และตรวจสอบค่าที่บันทึกหลังจากเปิดใหม่

การตรวจสอบประเภททำให้ลูปข้ามพฤติกรรมที่ไม่ใช่การหมุน การโหลดครั้งที่สองอ่านไฟล์ที่บันทึกลงในออบเจ็กต์การนำเสนอแยกต่างหาก ดังนั้นการเปรียบเทียบตรวจสอบข้อมูลที่คงอยู่จริง ไม่ใช่ค่าที่ยังอยู่ในหน่วยความจำ ตัวอย่างนี้สมมติว่าเอฟเฟกต์ที่รู้จักเป็นรายการแรกในซีเควนซ์หลัก; การเลือกพฤติกรรมตามประเภทไม่ได้ค้นหาเอฟเฟ็กต์ที่ถูกต้องในงานนำเสนอใด ๆ

use aspose\slides\Presentation;
use aspose\slides\SaveFormat;

$baseDirectory = getcwd();

$rotationClass = new JavaClass("com.aspose.slides.IRotationEffect");

$presentation = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "rotation.pptx");
try {
    $effect = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);

    $behaviors = $effect->getBehaviors();
    $behaviorCount = java_values($behaviors->getCount());
    for ($i = 0; $i < $behaviorCount; $i++) {
        $behavior = $behaviors->get_Item($i);
        if (java_instanceof($behavior, $rotationClass)) {
            $rotation = $behavior;
            $rotation->setBy(180);
        }
    }

    $presentation->save($baseDirectory . DIRECTORY_SEPARATOR . "rotation-edited.pptx", SaveFormat::Pptx);

    $reopened = new Presentation($baseDirectory . DIRECTORY_SEPARATOR . "rotation-edited.pptx");
    try {
        $savedEffect = $reopened->getSlides()->get_Item(0)->getTimeline()->getMainSequence()->get_Item(0);

        $savedBehaviors = $savedEffect->getBehaviors();
        $savedBehaviorCount = java_values($savedBehaviors->getCount());
        for ($i = 0; $i < $savedBehaviorCount; $i++) {
            $behavior = $savedBehaviors->get_Item($i);
            if (java_instanceof($behavior, $rotationClass)) {
                $rotation = $behavior;
                $preserved = abs(java_values($rotation->getBy()) - 180) < 0.001;
                echo "Rotation preserved: " . ($preserved ? "true" : "false") . PHP_EOL;
            }
        }
    } finally {
        $reopened->dispose();
    }
} finally {
    $presentation->dispose();
}

ผลลัพธ์คือ Rotation preserved: true. ใช้รูปแบบการตรวจสอบประเภทเดียวกันกับพฤติกรรมอื่น ๆ เพื่อทำการตรวจสอบการคงอยู่อย่างสมบูรณ์ เปรียบเทียบรูปร่างเป้าหมาย, เอฟเฟกต์, ประเภทและลำดับพฤติกรรม, การกำหนดเวลา, และคำสั่งเส้นทาง ใช้ความคลาดเคลื่อนเชิงตัวเลขสำหรับค่าทศนิยม สำหรับงานนำเสนอที่ไม่ทราบโครงสร้างแอนิเมชัน ดูที่ Read Shape Animations เพื่อท่องซีเควนซ์หลักและเชิงโต้ตอบ

ลำดับพฤติกรรม, พรีเซ็ต, และการเล่น

ลำดับใน BehaviorCollection คือลำดับที่บันทึกของการทำงานของเอฟเฟกต์ ไม่ใช่เพลย์ลิสต์ที่พฤติกรรมทุกตัวจะรอคำสั่งจากตัวก่อนหน้าโดยอัตโนมัติ การกำหนดเวลาและเอฟเฟกต์ที่บรรจุกำหนดการจัดตาราง พฤติกรรมสามารถทับซ้อนกันได้ และการทำงานบนแอตทริบิวต์เดียวกันอาจโต้ตอบผ่านการตั้งค่า additive และ accumulation อย่าใช้การจัดลำดับคอลเลกชันอย่างเดียวเพื่อกำหนด “ย้ายแล้วหมุน” ให้ใช้การกำหนดเวลาที่ชัดเจนหรือเอฟเฟกต์แยกตามที่อธิบายใน Shape Animation

[type] และ [subtype] ของเอฟเฟกต์อธิบายพรีเซ็ต แต่ไม่ได้อธิบายต้นไม้พฤติกรรมที่แก้ไขแล้วทั้งหมด เลือกพรีเซ็ตและ subtype ก่อนปรับพฤติกรรม: การเปลี่ยนพรีเซ็ตอาจสร้างคอลเลกชันใหม่และลบการทำงานที่คุณเพิ่มเอง ตัวอย่างเช่น การเปลี่ยนเอฟเฟกต์ Spin ที่ปรับแต่งเป็น Fade สามารถแทนที่พฤติกรรมการหมุนด้วยพฤติกรรม set และ filter ตรวจสอบคอลเลกชันใหม่หลังจากเปลี่ยนพรีเซ็ตหรือ subtype การล้างพรีเซ็ตอาจลบการทำงานที่พรีเซ็ตจำเป็นต้องมี ตัวอย่างใช้รูปทรงที่มองเห็นได้และแทนที่พฤติกรรม; ไม่ได้สร้างโครงสร้างพรีเซ็ตใหม่ทั้งหมด

ความเข้ากันได้ของรูปแบบ

ต้นไม้พฤติกรรมที่คงอยู่ไม่ได้รับประกันการเล่นที่เหมือนกันในทุกโปรแกรมแสดงหรือเครื่องมือแปลง ให้ตรวจสอบข้อมูลที่บันทึกและผลลัพธ์ที่เรนเดอร์แยกกัน

รูปแบบหรือผลลัพธ์ สิ่งที่ต้องตรวจสอบ
PPTX ใช้เป็นรูปแบบหลักสำหรับตัวอย่างนี้ เปิดใหม่เพื่อยืนยันต้นไม้พฤติกรรมที่แก้ไขได้ จากนั้นตรวจสอบการเล่นในเวอร์ชัน PowerPoint ที่ต้องการ
PPT ตัวแทนไบนารีแบบเก่าสามารถแตกต่างจาก PPTX ทดสอบการบันทึก‑เปิด‑เล่นแยกกัน; อย่าสรุปการสนับสนุนทุกการผสมผสานจากผลลัพธ์ PPTX ที่สำเร็จ
PDF, PNG, JPEG, and other static slide images มีเพียงภาพสไลด์คงที่ ไม่ได้เป็นไทม์ไลน์แอนิเมชันหรือเฟรมแอนิเมชันสุดท้ายที่รับประกัน
HTML5 สามารถเล่นแอนิเมชันที่สนับสนุนได้เมื่อเปิดใช้การแอนิเมชันของรูปทรงในตัวเลือกการส่งออก ทดสอบการผสมผสานแบบกำหนดเองในเบราว์เซอร์
Animated GIF เก็บเฟรมที่เรนเดอร์ ไม่ใช่พฤติกรรมแก้ไขได้หรือการโต้ตอบบนคลิก ตรวจสอบการเคลื่อนที่ที่เรนเดอร์จริง
Video เรนเดอร์เฟรมแอนิเมชันและเข้ารหัสเป็นวิดีโอ การสนับสนุนจำกัดอยู่ที่ animations and effects ที่รองรับ; คำสั่งและเหตุการณ์เชิงโต้ตอบจะไม่กลายเป็นไทม์ไลน์ที่แก้ไขได้

FAQ

ทำไมเอฟเฟกต์ของฉันถึงมีพฤติกรรมอยู่แล้วก่อนที่ฉันจะเพิ่มอะไรเลย?
การสร้างเอฟเฟกต์ที่กำหนดล่วงหน้าสามารถสร้างการทำงานพื้นฐานของมันได้ ตรวจสอบก่อนตัดสินใจต่อเติมพรีเซ็ตหรือแทนที่พฤติกรรม

การย้ายพฤติกรรมไปยังตำแหน่งแรกทำให้มันเล่นก่อนหรือไม่?
ไม่จำเป็น ลำดับคอลเลกชันไม่ใช่ตัวแทนของการกำหนดเวลา ตรวจสอบการหน่วง, ระยะเวลา, และปฏิสัมพันธ์ระหว่างการทำงานบนแอตทริบิวต์เดียวกัน

ทำไมคำสั่ง end ไม่มีจุด?
เป็นเครื่องหมายจบเส้นทาง ไม่ต้องการพิกัด ตรวจสอบอาเรย์จุดเป็น null เมื่ออ่านเส้นทางจากไฟล์

การทำรอบไป‑กลับสำเร็จถือว่ายืนยันการเล่นหรือไม่?
ไม่ การเปิดใหม่ยืนยันว่าคุณสมบัติที่ตรวจสอบยังคงอยู่ ต้องทดสอบโปรแกรมสไลด์โชว์หรือการส่งออกแบบแอนิเมชันแยกต่างหากเพื่อยืนยันพฤติกรรมภาพที่เห็น)