Vytvoření a úprava vlastních animačních chování v PHP

Přehled

Vlastní animační chování vám umožňuje řídit jednotlivé operace v rámci animačního efektu, jako je změna barvy, otáčení objektu nebo sledování upravitelné dráhy pohybu. Tento návod ukazuje, jak vytvářet a kombinovat chování, konfigurovat jejich načasování, prohlížet a upravovat existující animace a ověřit, že jejich vlastnosti přežijí uložení a opětovné otevření prezentace.

Pro předdefinované efekty a spouštěče kliknutí viz Animace tvaru.

Pochopte model animace

Animace je organizována jako Timeline → Sequence → Effect → Behaviors:

  • Každý snímek má časovou osu obsahující hlavní sekvenci a interaktivní sekvence.
  • Sekvence (Sequence) obsahuje efekty, které mohou cílit na různé tvary.
  • Efekt (Effect) identifikuje cílový tvar, předvolbu, podtyp a načasování efektu.
  • Kolekce vrácená metodou Effect::getBehaviors obsahuje operace implementující efekt: změna barvy, pohyb, otáčení, nastavení vlastnosti a další.

Vytvořte jednotlivá chování

Vyvolejte Sequence::addEffect pro vytvoření efektu a přístup ke kolekci getBehaviors. Předvolba může tuto kolekci naplnit automaticky. Uchovejte její operace při rozšiřování předvolby nebo použijte clear při záměrném nahrazení.

BehaviorFactory vytváří osm typů chování ilustrovaných níže. Pohyb je popsán v sekci Vytvoření dráhy pohybu. Každý úryvek obsahuje potřebné importy a předpokládá, že byl načten PHP/Java Bridge a knihovna Aspose.Slides pro PHP. Příklady pozdější úpravy uvádějí, který výstupní soubor používají.

Otáčení

Použijte createRotationEffect pro vytvoření otáčení. getBy určuje relativní úhel ve stupních; getFrom a getTo určují koncové body.

Příklad začíná efektem Spin, nahradí jeho přednastavené operace jedním otáčecím chováním a přiřadí mu dvousekundovou dobu trvání. Relativní úhel 90° vyjadřuje čtvrt otáčky od výchozí orientace tvaru, takže není potřeba explicitně zadávat výchozí úhel.

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 obsahuje jeden tvar a jedno otáčecí chování. Kolekce, načasování a příklady úprav otáčení níže používají tento soubor.

Měřítko

Použijte createScaleEffect s procenty X/Y: getFrom a getTo popisují počáteční a koncovou velikost, zatímco getBy popisuje relativní změnu. Zde 100 % znamená původní velikost.

Příklad zvětší oba rozměry z 100 % na 125 % během dvou sekund. Použití stejných horizontálních i vertikálních procent zachová proporce tvaru; různé procenta by natáhly jeden rozměr více než druhý.

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();
}

Barva

Použijte createColorEffect pro změnu výplně z modré na oranžovou. getFrom a getTo jsou barvy; getBy je posun barvy. BehaviorPropertyCollection identifikuje atribut, který je animován.

Výplň tvaru je inicializována na modrou, což odpovídá počáteční barvě animace. Výběr atributu výplně říká chování, kterou část tvaru má změnit; samotné koncové barvy neidentifikují tento atribut. Uložený efekt popisuje dvousekundový přechod na oranžovou.

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();
}

Filtr

Použijte createFilterEffect pro výběr stírání. getType, getSubtype a getReveal určují filtr, směr a zda má tvar odhalit nebo skrýt.

Tento příklad konfiguruje dvousekundové odhalení tvaru pomocí podtypu pravého směru. Nastavení filtru patří k chování uvnitř efektu, a proto je konfigurováno po odstranění původních operací předvolby.

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();
}

Vlastnost

Použijte createPropertyEffect pro animaci neprůhlednosti. getFrom, getTo a getBy jsou řetězce interpretované pomocí getValueType a getCalcMode. Zvolte koncové hodnoty nebo relativní posun místo nastavení všech tří najednou.

Zde je vybraný atribut neprůhlednost a číselné řetězce představují změnu z 25 % neprůhlednosti na plnou neprůhlednost. Lineární interpolace popisuje plynulou změnu mezi těmito hodnotami. Při úpravě tohoto příkladu na jiný atribut zvolte typ hodnoty a koncové hodnoty vhodné pro daný atribut.

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();
}

Nastavení

Použijte createSetEffect pro přiřazení viditelnosti pomocí getTo. Chování typu set neinterpoluje mezi koncovými body.

Příklad vybere atribut viditelnosti a při spuštění chování přiřadí řetězec visible. Obdélník je v této minimální prezentaci již viditelný, takže přiřazení nemusí samostatně vytvořit zřetelnou vizuální změnu. Taková operace je užitečná jako součást většího efektu, který také řídí, kdy se tvar skryje nebo zobrazí.

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();
}

Příkaz

Použijte createCommandEffect a nakonfigurujte getType, getCommandString a getShapeTarget. Umístěte zvukový záznam WAV pojmenovaný sample.wav do pracovního adresáře. Tento příklad jej vloží pomocí addAudioFrameEmbedded a připojí příkaz přehrání k audio‑rámci.

Audio‑rámec je zároveň cílem efektu i cílem příkazu. Tímto se propojí požadavek na přehrání se zabudovaným záznamem; samotný řetězec příkazu neurčuje, který mediální objekt ovládat. Efekt je nastaven tak, aby se spustil kliknutím během prezentace.

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();
}

Uložení uloží příkaz do command.pptx; nepřehraje záznam. Přehrávání vyžaduje přehrávač prezentací, který podporuje příkaz i jeho mediální cíl.

Správa kolekce chování

BehaviorCollection podporuje add, insert, remove, a removeAt. Tento příklad otevře rotation.pptx, přidá měřítko, přesune jej před otáčení a odstraní otáčení. Odstranění a opětovné vložení stejného objektu změní jeho uloženou pozici, aniž by došlo k vytvoření kopie.

Postup úprav mění kolekci z otáčení–měřítka na měřítko–otáčení a nakonec jen na měřítko. Indexy odkazují na aktuální kolekci, takže odstraňování používá nový index otáčení po přeuspořádání. Konečné vyjmenování potvrdí, které chování bude uloženo.

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();
}

Výstup je ScaleEffect: zůstane jen měřítko. Pořadí v kolekci samo o sobě neplánuje chování jedno po druhém. Vyčistěte kolekci pouze při úplném nahrazení všech jejích operací.

Konfigurace načasování chování

Chování má své vlastní Timing, nezávislé na načasování vráceném metodou Effect::getTiming. Načasování efektu řídí obalující efekt; načasování chování popisuje operaci uvnitř něj.

Nastavení doby trvání, zpoždění, opakování a zrychlení

Otevřete rotation.pptx a nastavte dobu trvání (getDuration) a zpoždění spouštěče (getTriggerDelayTime) v sekundách, poté nastavte počet opakování pomocí setRepeatCount. getAccelerate a getDecelerate jsou zlomky doby trvání; jejich součet udržujte nejvýše na 1.

Vstupní soubor je ten vytvořený v příkladu otáčení, kde je první chování známé jako otáčení. Tento příklad mění jen načasování tohoto chování; jeho úhel 90° zůstává nedotčen. Udržování úhlu a načasování odděleně usnadňuje úpravu tempa bez nutnosti přestavovat animaci.

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();
}

Chování používá dvousekundovou dobu trvání, půlsekundové zpoždění a počet opakování 3. Prvních a posledních 20 % jeho doby trvání je vyhrazeno pro zrychlení a zpomalení.

Další politiky opakování zahrnují getRepeatDuration, getRepeatUntilEndSlide, a getRepeatUntilNextClick; zvolte jednu politiku místo povolení všech najednou. getAutoReverse přehraje animaci pozpátku po dopředném průchodu. Zrychlení a zpomalení se vztahují na plynulé změny, ne na diskrétní přiřazení nebo příkazy.

Vytvoření dráhy pohybu

Použijte createMotionEffect pro vytvoření pohybu. Jeho getFrom, getTo, a getBy popisují koordináty nebo offsety založené na procentech. Pro upravitelnou trasu vytvořte MotionPath a přiřaďte ji pomocí MotionEffect::setPath. MotionPath ukládá příkazy cesty.

MotionCommandPathType vybírá operaci:

Příkaz Body Význam
MoveTo One Nastaví počáteční pozici.
LineTo One Pohne se po přímém úseku k jeho koncovému bodu.
CurveTo Three Následuje kubickou křivku definovanou dvěma řídícími body a koncovým bodem.
CloseLoop None Vrátí se na počáteční pozici.
End None Ukončí cestu.

MotionPathPointsType popisuje charakteristiky úprav bodů, např. roh nebo hladký bod. Nepřepisuje typ příkazu. Použijte typ bodu křivky pro příklad křivky níže a typ rohového bodu pro přímé segmenty.

Souřadnice cesty jsou normalizovány na rozměry snímku: posun X = 0.25 představuje čtvrtinu šířky snímku, nikoli 0.25 pt. Kladné Y běží dolů. Absolutní příkazy určují pozice v souřadnicovém systému cesty; relativní příkazy určují offsety od aktuální pozice. To je oddělené od getOrigin, který vybírá referenční rámec cesty, a getPathEditMode, který řídí, jak se cesta pohybuje při pohybu tvaru.

Vytvoření přímé cesty

Vytvořte chování pohybu s počátečním bodem, jedním přímým segmentem a koncovým příkazem. MotionPath::add přijímá typ příkazu, jeho body, typ bodu a příznak relativních souřadnic.

Počáteční příkaz stanoví (0, 0) a čára končí v (0.25, 0), což dává trase horizontální posun o čtvrtinu šířky snímku. Koncový příkaz nemá žádné souřadnicové body. Jakmile je cesta přiřazena, přidání chování pohybu k efektu propojí tuto trasu s obdélníkem.

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 obsahuje jedno chování pohybu se třemi příkazy cesty. Následující příklady úprav souboru používají tuto známou strukturu.

Porovnání absolutních a relativních souřadnic

Tyto dva objekty cesty popisují stejnou trasu. Absolutní příkaz končí v (0.3, 0.1); relativní příkaz přidá (0.1, 0.1) k aktuální pozici, (0.2, 0).

Obě cesty začínají na stejné pozici. Pro relativní čáru přidejte její X a Y offsety k aktuální pozici a získáte koncový bod; pro absolutní čáru přečtěte koncový bod přímo. Změna příznaku bez konverze souřadnic by popisovala jinou trasu.

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);

Přiřaďte libovolnou cestu chování pohybu a použijte ji v prezentaci. Poslední boolovský parametr vybírá relativní souřadnice pro daný příkaz.

Nahrazení čáry křivkou

Otevřete motion.pptx a nahraďte její příkaz čáry kubickou křivkou. Nejprve zadejte dva řídící body, poté koncový bod.

Počáteční pozice je určena předchozím příkazem. První dva body tvarují křivku, zatímco třetí je její cíl; nejedná se o tři po sobě jdoucí cíle. Aktualizace typu příkazu, typu úpravy bodu a pole bodů najednou udržuje segment v souladu s novou geometrií.

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();
}

Cesta v curve.pptx stále obsahuje tři příkazy; její prostřední příkaz nyní definuje křivku.

Prohlížení a úprava uložené cesty

Každý MotionCmdPath zveřejňuje getPoints, getCommandType, getPointsType, a isRelative. Následující příklady používají známou třípříkazovou cestu v motion.pptx. Pro libovolný vstup najděte požadovaný efekt a před úpravou indexu zkontrolujte typy příkazů a počet bodů.

Čtení příkazů a souřadnic

Přečtěte cestu bez změny. Příkazy End a CloseLoop nevyžadují body, proto umožněte nulové pole bodů.

Výstup spáruje každé číselné ID příkazu s příznakem relativních souřadnic před výpisem jeho bodů. To vám umožní rozlišit koncový bod od offsetu před úpravou cesty. Křivka by vypsala tři body, zatímco přímá čára v tomto souboru pouze jeden.

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();
}

Výpis obsahuje počáteční bod, absolutní čáru končící v (0.25, 0) a příkaz End.

Změna koncového bodu

Otevřete motion.pptx a nahraďte pole bodů čáry, aby se změnil její koncový bod.

Ve vstupním souboru je index 0 počáteční příkaz a index 1 čára. Nahrazením jediného bodu čáry změníte její cíl, aniž byste měnili typ příkazu, načasování nebo pozici v kolekci. Protože příkaz používá absolutní souřadnice, nový pár udává pozici, nikoli přidaný offset.

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();
}

Čára v motion-endpoint.pptx končí v (0.4, 0.1); původní soubor zůstává nezměněn.

Nahrazení segmentu

Použijte insert a removeAt pro nahrazení čáry v motion.pptx. Vkládání posune starou čáru na index 2.

Toto demonstruje nahrazení objektu příkazu místo úpravy jeho existujících souřadnic. Po vložení kolekce dočasně obsahuje počáteční příkaz, novou čáru, starou čáru a příkaz End. Odstraněním indexu 2 se stará čára zahodí a nová trasa zůstane.

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();
}

Uložená cesta stále má tři příkazy, nová čára končí v (0.2, 0.1) a poslední příkaz je End.

Úprava a ověření existujícího chování

Když není známý index chování, vyberte jej podle typu. Tento příklad otevře rotation.pptx, najde jeho RotationEffect, změní úhel a po opětovném otevření zkontroluje uloženou hodnotu.

Kontrola typu umožňuje smyčce přeskočit chování, která nejsou otáčením. Druhé načtení načte uložený soubor do samostatného objektu prezentace, takže srovnání kontroluje trvalá data, nikoli hodnotu stále drženou v paměti. Tento příklad stále předpokládá, že známý efekt je první v hlavní sekvenci; výběr chování podle typu nevyhledá správný efekt v libovolné prezentaci.

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();
}

Výstup je Rotation preserved: true. Použijte stejný vzor kontroly typu i pro další chování. Pro úplnou kontrolu zachování porovnejte cílový tvar, efekt, typy a pořadí chování, načasování a příkazy cesty. Použijte číselnou toleranci pro hodnoty s plovoucí řádovou čárkou. Pro prezentaci s neznámým rozvržením animací viz Read Shape Animations pro procházení hlavních i interaktivních sekvencí.

Pořadí chování, předvolby a přehrávání

Pořadí v BehaviorCollection je uložené pořadí operací efektu. Není to playlist, ve kterém každé chování automaticky čeká na předchozí. Načasování a obalující efekt určují plánování. Chování se mohou překrývat a operace na stejné vlastnosti mohou spolupracovat prostřednictvím nastavení additive a accumulation. Nepoužívejte pouhé přeuspořádání kolekce k naplánování „přesun, pak otáčení“; použijte explicitní načasování nebo samostatné efekty, jak je popsáno v Animace tvaru.

Metoda getType a getSubtype efektu popisují jeho předvolbu. Nejsou kompletním popisem upraveného stromu chování. Vyberte předvolbu a podtyp před přizpůsobením chování: změna předvolby může přestavět kolekci a zahodit vaše vlastní operace. Například změna přizpůsobeného efektu Spin na Fade může nahradit otáčecí chování chováním set a filter. Po změně předvolby nebo podtypu kolekci znovu prohlédněte. Vymazání přednastavených chování může také odstranit operace viditelnosti nebo inicializace, které předvolba potřebuje. Příklady úmyslně používají viditelné tvary a nahrazují chování; nepřestavují úplnou implementaci každé předvolby.

Kompatibilita formátů

Uchovaný strom chování nezaručuje identické přehrávání ve všech prohlížečích nebo exportních rendererech. Zkontrolujte uložená data a renderovaný výstup odděleně.

Formát nebo výstup Co ověřit
PPTX Použijte jako primární formát pro tyto příklady. Otevřete jej znovu pro ověření editovatelného stromu chování, poté zkontrolujte přehrávání ve požadované verzi PowerPointu.
PPT Dědictví binárního formátu může být odlišné od PPTX. Otestujte samostatný cyklus ulož‑a‑znovu‑otevři a přehrávání; nevyvozuje se podpora pro každou vlastní kombinaci z úspěšného výstupu PPTX.
PDF, PNG, JPEG a další statické obrázky snímků Obsahují statický snímek, ne přehratelnou časovou osu chování ani garantovaný finální animační snímek.
HTML5 Může přehrávat podporované animace, pokud je v možnostech exportu povolena animace tvaru. Otestujte vlastní kombinace v prohlížeči.
Animovaný GIF Ukládá vykreslené snímky, ne editovatelné chování ani interaktivní události na kliknutí. Zkontrolujte skutečný vykreslený pohyb.
Video Vykreslí animační snímky a zakóduje je jako video. Podpora je omezena na podporované animace a efekty rendereru; příkazy a interaktivní události se nestanou editovatelnou časovou osou.

Často kladené otázky

Proč můj efekt obsahuje chování před tím, než něco přidám?

Vytvoření předdefinovaného efektu může vytvořit jeho podkladové operace. Prohlédněte je před tím, než se rozhodnete, zda rozšířit předvolbu nebo nahradit její chování.

Způsobí přesunutí chování na začátek, že se přehraje jako první?

Ne nutně. Pořadí v kolekci nenahrazuje načasování. Zkontrolujte zpoždění, dobu trvání a interakce mezi operacemi na stejné vlastnosti.

Proč má příkaz End žádné body?

Označuje konec cesty a nevyžaduje souřadnice. Při prohlížení cesty načtené ze souboru kontrolujte, zda pole bodů není null.

Je úspěšná round‑trip dostatečná k potvrzení přehrávání?

Ne. Opětovné otevření potvrzuje zachování vlastností, které jste zkontrolovali. Přehrajte prezentaci nebo animovaný export zvlášť, abyste potvrdili vizuální chování.