Tworzenie i modyfikowanie niestandardowych zachowań animacji w PHP
Przegląd
Niestandardowe zachowania animacji pozwalają kontrolować poszczególne operacje w ramach efektu animacji, takie jak zmiana koloru, obracanie kształtu lub podążanie za edytowalną ścieżką ruchu. Ten przewodnik pokazuje, jak tworzyć i łączyć zachowania, konfigurować ich synchronizację, przeglądać i modyfikować istniejące animacje oraz weryfikować, że ich właściwości przetrwają zapisanie i ponowne otwarcie prezentacji.
Dla predefiniowanych efektów i wyzwalaczy kliknięcia zobacz Animacja kształtów.
Zrozumienie modelu animacji
Animacja jest zorganizowana jako Oś czasu → Sekwencja → Efekt → Zachowania:
- Każdy slajd posiada oś czasu zawierającą główną sekwencję oraz sekwencje interaktywne.
- Sekwencja (Sequence) zawiera efekty, które mogą dotyczyć różnych kształtów.
- Efekt (Effect) określa docelowy kształt, preset, podtyp i synchronizację efektu.
- Kolekcja zwracana przez Effect::getBehaviors zawiera operacje implementujące efekt: zmianę koloru, przemieszczanie, obracanie, ustawianie właściwości itp.
Tworzenie pojedynczych zachowań
Wywołaj Sequence::addEffect aby utworzyć efekt i uzyskać dostęp do kolekcji getBehaviors. Preset może automatycznie wypełnić tę kolekcję. Zachowaj jego operacje przy rozszerzaniu presetu lub użyj clear gdy świadomie je zastępujesz.
BehaviorFactory tworzy osiem typów zachowań przedstawionych poniżej. Ruch jest opisany w sekcji Build a Motion Path. Każdy fragment kodu zawiera importy i zakłada, że PHP/Java Bridge oraz biblioteka Aspose.Slides PHP zostały załadowane. Przykłady edycji podają, którego pliku wyjściowego używają.
Obrót
Użyj createRotationEffect aby utworzyć obrót. getBy określa względny kąt w stopniach; getFrom i getTo określają punkty końcowe.
Przykład rozpoczyna się od efektu Spin, zastępuje jego operacje presetowe jednym zachowaniem obrotu i nadaje temu zachowaniu dwusekundowy czas trwania. Względny kąt 90 stopni oznacza ćwierć obrotu od początkowej orientacji kształtu, więc nie jest potrzebny wyraźny kąt początkowy.
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 zawiera jeden kształt i jedno zachowanie obrotu. Kolekcja, synchronizacja i przykłady edycji obrotu poniżej używają tego pliku.
Skala
Użyj createScaleEffect z wartościami procentowymi X/Y: getFrom i getTo opisują początkowy i końcowy rozmiar, natomiast getBy opisuje zmianę względną. Tutaj 100 oznacza rozmiar oryginalny.
Przykład zwiększa oba wymiary z 100 % do 125 % w ciągu dwóch sekund. Użycie równych wartości poziomych i pionowych zachowuje proporcje kształtu; różne wartości rozciągną jedną z osi bardziej niż drugą.
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();
}
Kolor
Użyj createColorEffect aby zmienić wypełnienie z niebieskiego na pomarańczowy. getFrom i getTo są kolorami; getBy jest przesunięciem koloru. [BehaviorPropertyCollection] zachowania identyfikuje atrybut, który jest animowany.
Stałe wypełnienie kształtu jest zainicjowane jako niebieskie, pasujące do początkowego koloru animacji. Wybranie atrybutu fill-color informuje zachowanie, którą część kształtu zmienić; same końcowe kolory nie określają tego atrybutu. Zapisany efekt opisuje dwusekundową przejście do pomarańczowego.
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
Użyj createFilterEffect aby wybrać wycieranie. getType, getSubtype, i getReveal określają filtr, kierunek oraz czy odsłonić czy ukryć kształt.
Ten przykład konfiguruje dwusekundowe wycieranie, które odsłania kształt przy użyciu podtypu w prawo. Ustawienia filtru należą do zachowania wewnątrz efektu, więc są konfigurowane po usunięciu pierwotnych operacji presetu.
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();
}
Właściwość
Użyj createPropertyEffect aby animować krycie. getFrom, getTo, i getBy są ciągami znaków interpretowanymi przy użyciu getValueType i getCalcMode. Wybierz końcowe wartości lub przesunięcie względne zamiast ustawiania wszystkich trzech jednocześnie.
W tym przykładzie wybranym atrybutem jest krycie, a numeryczne ciągi reprezentują zmianę z 25 % krycia do pełnego krycia. Liniowa interpolacja opisuje stopniową zmianę pomiędzy tymi wartościami. Przy dostosowywaniu tego przykładu do innego atrybutu, wybierz typ wartości i wartości końcowe odpowiednie dla tego atrybutu.
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();
}
Ustaw
Użyj createSetEffect aby przypisać widoczność przy użyciu getTo. Zachowanie typu set nie interpoluje pomiędzy punktami końcowymi.
Przykład wybiera atrybut widoczności i przypisuje ciąg visible podczas wykonywania zachowania. Prostokąt jest już widoczny w tej minimalnej prezentacji, więc przypisanie może nie wywołać wyraźnej zmiany wizualnej samo w sobie. Taka operacja jest przydatna jako część większego efektu, który również kontroluje, kiedy kształt zostaje ukryty lub widoczny.
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();
}
Polecenie
Użyj createCommandEffect i skonfiguruj getType, getCommandString, oraz getShapeTarget. Umieść nagranie WAV o nazwie sample.wav w katalogu roboczym. Ten przykład osadza je przy pomocy addAudioFrameEmbedded i dołącza polecenie odtworzenia do ramki audio.
Rama audio jest zarówno celem efektu, jak i celem polecenia. Łączy to żądanie odtworzenia z osadzonym nagraniem; sam ciąg polecenia nie określa, który obiekt multimedialny ma być kontrolowany. Efekt jest skonfigurowany tak, by rozpocząć się po kliknięciu podczas pokazu slajdów.
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();
}
Zapis zapisuje polecenie w pliku command.pptx; nie odtwarza nagrania. Odtwarzanie wymaga odtwarzacza pokazu slajdów, który obsługuje polecenie i jego docelowy media.
Zarządzanie kolekcją zachowań
BehaviorCollection obsługuje add, insert, remove, oraz removeAt. Ten przykład otwiera rotation.pptx, dodaje skalowanie, przenosi je przed obrót i usuwa obrót. Usunięcie i ponowne wstawienie tego samego obiektu zmienia jego zapisane położenie bez tworzenia kopii.
Ciąg edycji zmienia kolekcję z rotation–scale na scale–rotation, a następnie na sam scale. Indeksy odnoszą się do bieżącej kolekcji, więc usunięcie używa nowego indeksu obrotu po przestawieniu. Ostateczna enumeracja potwierdza, które zachowanie zostanie zapisane.
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();
}
Wynik to ScaleEffect: pozostaje tylko skalowanie. Kolejność w kolekcji nie planuje zachowań jedno po drugim. Czyść kolekcję tylko wtedy, gdy zastępujesz wszystkie jej operacje.
Konfiguracja czasu zachowania
Zachowanie ma własny Timing, niezależny od czasu zwracanego przez Effect::getTiming. Czas efektu planuje otaczający efekt; czas zachowania opisuje operację wewnątrz niego.
Ustawienie czasu trwania, opóźnienia, powtórzeń i przyspieszenia
Otwórz rotation.pptx i ustaw czas trwania (getDuration) oraz opóźnienie wyzwalacza (getTriggerDelayTime) w sekundach, a następnie skonfiguruj liczbę powtórzeń przy pomocy setRepeatCount. getAccelerate i getDecelerate są ułamkami czasu trwania; ich suma nie powinna przekraczać 1.
Plik wejściowy to ten utworzony w przykładzie obrotu, w którym pierwsze zachowanie jest znanym obrotem. Ten przykład zmienia tylko czas tego zachowania; jego kąt 90 stopni pozostaje niezmieniony. Rozdzielenie kąta i czasu ułatwia dostosowanie tempa bez przebudowywania animacji.
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();
}
Zachowanie używa dwusekundowego czasu trwania, półsekundowego opóźnienia i liczby powtórzeń 3. Pierwsze i ostatnie 20 % jego czasu trwania służą do przyspieszenia i zwolnienia.
Inne polityki powtarzania obejmują getRepeatDuration, getRepeatUntilEndSlide, i getRepeatUntilNextClick; wybierz jedną politykę zamiast włączania ich wszystkich jednocześnie. getAutoReverse odtwarza animację wstecz po przejściu w przód. Przyspieszenie i zwolnienie mają zastosowanie do ciągłych zmian, a nie do dyskretnych przypisań lub poleceń.
Budowanie ścieżki ruchu
Użyj createMotionEffect aby utworzyć ruch. Jego getFrom, getTo, i getBy opisują współrzędne lub przesunięcia wyrażone w procentach. Aby uzyskać edytowalną trasę, utwórz MotionPath i przypisz ją przy pomocy MotionEffect::setPath. [MotionPath] przechowuje polecenia ścieżki.
| Polecenie | Punkty | Znaczenie |
|---|---|---|
| MoveTo | One | Ustaw początkową pozycję. |
| LineTo | One | Przemieść się wzdłuż prostej do jej punktu końcowego. |
| CurveTo | Three | Podążaj za krzywą sześcienną określoną przez dwa punkty kontrolne i punkt końcowy. |
| CloseLoop | None | Powróć do pozycji początkowej. |
| End | None | Zakończ ścieżkę. |
MotionPathPointsType opisuje charakterystyki edycji punktów, takie jak punkt narożny lub wygładzony. Nie zastępuje to typu polecenia. Użyj typu punktu krzywej w przykładzie krzywej poniżej oraz typu punktu narożnego dla segmentów prostych.
Współrzędne ścieżki są normalizowane do wymiarów slajdu: przemieszczenie X o 0,25 oznacza jedną czwartą szerokości slajdu, a nie 0,25 punktu. Dodatni Y biegnie w dół. Polecenia bezwzględne określają pozycje w układzie współrzędnych ścieżki; polecenia względne określają przesunięcia od bieżącej pozycji. To jest oddzielne od getOrigin, które wybiera ramkę odniesienia ścieżki, oraz getPathEditMode, które steruje, jak ścieżka porusza się, gdy kształt jest przesuwany.
Utworzenie prostej ścieżki
Utwórz zachowanie ruchu z punktem początkowym, jednym prostym segmentem i poleceniem końcowym. MotionPath::add przyjmuje typ polecenia, jego punkty, typ punktu oraz flagę współrzędnych względnych.
Polecenie początkowe ustawia (0, 0), a linia kończy się w (0,25, 0), co daje trasie poziome przemieszczenie o jedną czwartą szerokości slajdu. Polecenie końcowe nie ma punktów współrzędnych. Po przypisaniu ścieżki, dodanie zachowania ruchu do efektu łączy tę trasę z prostokątem.
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 zawiera jedno zachowanie ruchu z trzema poleceniami ścieżki. Następujące przykłady edycji pliku używają tej znanej struktury.
Porównanie współrzędnych bezwzględnych i względnych
Te dwa obiekty ścieżki opisują tę samą trasę. Polecenie bezwzględne kończy się w (0,3, 0,1); polecenie względne dodaje (0,1, 0,1) do bieżącej pozycji, czyli (0,2, 0).
Obie ścieżki zaczynają się w tej samej pozycji. Dla linii względnej, dodaj jej przesunięcia X i Y do bieżącej pozycji, aby uzyskać punkt końcowy; dla linii bezwzględnej, odczytaj punkt końcowy bezpośrednio. Zmiana flagi bez przeliczania współrzędnych opisałaby inną trasę.
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);
Przypisz dowolną ścieżkę do zachowania ruchu, aby użyć jej w prezentacji. Ostatni argument typu Boolean wybiera współrzędne względne dla tego polecenia.
Zamiana linii na krzywą
Otwórz motion.pptx i zamień jego polecenie linii na krzywą sześcienną. Najpierw podaj dwa punkty kontrolne, a następnie punkt końcowy.
Pozycja początkowa jest dostarczona przez poprzednie polecenie. Pierwsze dwa punkty kształtują krzywą, a trzeci jest jej docelowym punktem; nie są to trzy kolejne cele. Aktualizacja typu polecenia, typu edycji punktów i tablicy punktów razem utrzymuje segment spójny z nową 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();
}
Ścieżka w curve.pptx nadal ma trzy polecenia, a środkowe polecenie teraz definiuje krzywą.
Inspekcja i edycja zapisanej ścieżki
Każdy MotionCmdPath udostępnia getPoints, getCommandType, getPointsType, oraz isRelative. Poniższe przykłady używają znanej trójpoleceniowej ścieżki w motion.pptx. Dla dowolnego wejścia, znajdź zamierzony efekt i sprawdź typy poleceń oraz liczbę punktów przed edycją według indeksu.
Odczyt poleceń i współrzędnych
Odczytaj ścieżkę bez jej modyfikacji. Polecenia End i CloseLoop nie wymagają punktów, więc uwzględnij możliwość pustej tablicy punktów.
Wynik paruje każdy numeryczny typ polecenia z flagą współrzędnych względnych przed wypisaniem jego punktów. Pozwala to odróżnić punkt końcowy od przesunięcia przed modyfikacją ścieżki. Krzywa wypisałaby trzy punkty, natomiast prosta linia w tym pliku wypisuje tylko 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();
}
Lista zawiera punkt początkowy, bezwzględną linię kończącą się w (0,25, 0) oraz polecenie end.
Zmiana punktu końcowego
Otwórz motion.pptx i zamień tablicę punktów linii, aby przenieść jej punkt końcowy.
W pliku wejściowym indeks 0 to polecenie początkowe, a indeks 1 to linia. Zamiana jednego punktu linii zmienia jej docelową pozycję bez zmiany typu polecenia, czasu ani pozycji w kolekcji. Ponieważ polecenie używa współrzędnych bezwzględnych, nowa para określa pozycję, a nie dodatkowe przesunięcie.
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();
}
Linia w motion-endpoint.pptx kończy się w (0,4, 0,1); oryginalny plik pozostaje niezmieniony.
Zamiana segmentu
Użyj insert i removeAt aby zamienić linię w motion.pptx. Wstawienie przesuwa starą linię do indeksu 2.
To pokazuje zamianę obiektu polecenia zamiast edytowania jego istniejących współrzędnych. Po wstawieniu kolekcja tymczasowo zawiera polecenie początkowe, nową linię, starą linię i polecenie end. Usunięcie indeksu 2 usuwa starą linię i pozostawia nową trasę.
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();
}
Zapisana ścieżka nadal ma trzy polecenia, przy czym nowa linia kończy się w (0,2, 0,1) a polecenie end jest ostatnie.
Modyfikacja i weryfikacja istniejącego zachowania
Gdy indeks zachowania jest nieznany, wybierz je według typu. Ten przykład otwiera rotation.pptx, znajduje jego RotationEffect, zmienia kąt i sprawdza zapisaną wartość po ponownym otwarciu.
Sprawdzenie typu pozwala pętli pominąć zachowania, które nie są obrotami. Drugi odczyt wczytuje zapisany plik do osobnego obiektu prezentacji, więc porównanie sprawdza trwałe dane, a nie wartość wciąż trzymaną w pamięci. Ten przykład nadal zakłada, że znany efekt jest pierwszy w głównej sekwencji; wybieranie zachowania według typu nie znajduje właściwego efektu w dowolnej prezentacji.
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();
}
Wynik to Rotation preserved: true. Zastosuj ten sam wzorzec sprawdzania typu do innych zachowań. Dla pełnej weryfikacji zachowania porównaj docelowy kształt, efekt, typy i kolejność zachowań, czas oraz polecenia ścieżki. Użyj tolerancji numerycznej dla wartości zmiennoprzecinkowych. Dla prezentacji o nieznanym układzie animacji, zobacz Read Shape Animations w celu przeglądu głównych i interaktywnych sekwencji.
Kolejność zachowań, presety i odtwarzanie
Kolejność w BehaviorCollection jest zapisaną kolejnością operacji efektu. Nie jest to playlista, w której każde zachowanie automatycznie czeka na poprzednie. Synchronizacja i otaczający efekt określają harmonogram. Zachowania mogą się nakładać, a operacje na tej samej właściwości mogą oddziaływać poprzez ustawienia additive i accumulation. Nie używaj samego przestawiania kolekcji, aby zaplanować „przesuń, a potem obróć”; użyj wyraźnej synchronizacji lub osobnych efektów, jak opisano w Shape Animation.
getType i getSubtype efektu opisują jego preset. Nie stanowią one pełnego opisu edytowanego drzewa zachowań. Wybierz preset i podtyp przed dostosowaniem zachowań: zmiana presetu może przebudować kolekcję i usunąć Twoje niestandardowe operacje. Na przykład, zmiana spersonalizowanego efektu Spin na Fade może zamienić jego zachowanie obrotu na zachowania set i filter. Ponownie sprawdź kolekcję po zmianie presetu lub podtypu. Czyszczenie zachowań presetu może również usunąć operacje widoczności lub inicjalizacji, których preset wymaga. Przykłady celowo używają widocznych kształtów i zastępują zachowania; nie rekonstruują one implementacji każdego presetu.
Kompatybilność formatów
Zachowane drzewo zachowań nie gwarantuje identycznego odtwarzania we wszystkich przeglądarkach czy narzędziach eksportu. Sprawdź oddzielnie zapisane dane i wygenerowany wynik.
| Format lub wyjście | Co zweryfikować |
|---|---|
| PPTX | Używaj jako głównego formatu w tych przykładach. Otwórz ponownie, aby zweryfikować edytowalne drzewo zachowań, a następnie sprawdź odtwarzanie w docelowej wersji PowerPointa. |
| PPT | Starsza reprezentacja binarna może różnić się od PPTX. Przetestuj osobny cykl zapisu‑i‑ponownego otwarcia oraz odtwarzanie; nie zakładaj wsparcia dla każdej niestandardowej kombinacji na podstawie udanego wyniku PPTX. |
| PDF, PNG, JPEG i inne statyczne obrazy slajdów | Zawierają statyczną reprezentację slajdu, nie odtwarzalną oś czasu zachowań ani gwarantowaną finalną klatkę animacji. |
| HTML5 | Może odtwarzać obsługiwane animacje, gdy animacja kształtów jest włączona w opcjach eksportu. Przetestuj niestandardowe kombinacje w przeglądarce. |
| Animated GIF | Zawiera renderowane klatki, nie edytowalne zachowania ani interakcję wyzwalaną kliknięciem. Sprawdź rzeczywisty rendowany ruch. |
| Video | Renderuje klatki animacji i koduje je jako wideo. Obsługa jest ograniczona do obsługiwanych animacji i efektów renderera; polecenia i zdarzenia interaktywne nie stają się edytowalną osią czasu. |
FAQ
Dlaczego mój efekt zawiera zachowania zanim coś dodałem?
Tworzenie predefiniowanego efektu może generować jego podstawowe operacje. Przejrzyj je przed podjęciem decyzji, czy rozszerzyć preset, czy zastąpić jego zachowania.
Czy przeniesienie zachowania na początek sprawia, że odtwarzane jest najpierw?
Niekoniecznie. Kolejność w kolekcji nie zastępuje synchronizacji. Sprawdź opóźnienia, czasy trwania oraz interakcje między operacjami na tej samej właściwości.
Dlaczego polecenie end nie ma punktów?
Zaznacza koniec ścieżki i nie wymaga współrzędnych. Sprawdź, czy tablica punktów nie jest pusta przy inspekcji ścieżki odczytanej z pliku.
Czy udana pełna pętla wystarczy, aby potwierdzić odtwarzanie?
Nie. Ponowne otwarcie potwierdza zachowanie sprawdzonych właściwości. Przetestuj odtwarzacz pokazu slajdów lub eksport animacji osobno, aby zweryfikować jego zachowanie wizualne.