Egyedi animációs viselkedések létrehozása és módosítása Java-ban
Áttekintés
Az egyéni animációs viselkedések lehetővé teszik, hogy egy animációs hatáson belül egyedi műveleteket vezéreljünk, például szín módosítását, alakzat forgatását vagy szerkeszthető mozgásútvonal követését. Ez az útmutató bemutatja, hogyan hozhatunk létre és kombinálhatunk viselkedéseket, hogyan állíthatjuk be azok időzítését, hogyan vizsgálhatjuk és módosíthatjuk a meglévő animációkat, valamint hogyan ellenőrizhetjük, hogy a tulajdonságaik megmaradnak-e a prezentáció mentése és újranyitása után.
Az előre definiált hatások és kattintásindítók tekinthetők a Shape Animation oldalán.
Értsük meg az animációs modellt
Az animáció a Timeline → Sequence → Effect → Behaviors struktúrában szerveződik:
- A getTimeline metódus visszaadja a dia idővonalát, amely tartalmazza a fő szekvenciát és az interaktív szekvenciákat.
- Az ISequence hatásokat tartalmaz, amelyek különböző alakzatokra is irányulhatnak.
- Az IEffect meghatározza a célalakzatot, az előre beállított hatást, az al típust és az animáció időzítését.
- Az IEffect.getBehaviors által visszaadott gyűjtemény tartalmazza az effektus megvalósításához szükséges műveleteket: színváltoztatás, mozgatás, forgatás, tulajdonság beállítása stb.
Egyedi viselkedések létrehozása
Hívja a ISequence.addEffect metódust egy effektus létrehozásához, és érje el a getBehaviors gyűjteményt. Egy előre beállított hatás automatikusan feltöltheti ezt a gyűjteményt. Tartsa meg a műveleteket a preset kibővítésekor, vagy használja a clear metódust, ha szándékosan helyettesíti őket.
IBehaviorFactory a lent illusztrált nyolc viselkedéstípust hozza létre. A mozgás a Build a Motion Path részben kerül tárgyalásra. Minden kódrészlet tartalmazza az importokat; helyezze a végrehajtható utasításokat egy metódusba. A későbbi szerkesztési példák megadják, melyik kimeneti fájlt használják.
Forgatás
Használja a createRotationEffect metódust forgatás létrehozásához. A getBy relatív szöget ad meg fokban; a getFrom és a getTo a végpontokat határozzák meg.
A példa egy Spin hatással indul, helyettesíti annak preset műveleteit egy forgatás viselkedéssel, és két másodperces időtartamot ad ennek. A 90 fokos relatív szög a kiindulási tájolásból egy negyedfordulatot jelent, ezért nem szükséges explicite kezdőszöget megadni.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.Spin, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
IRotationEffect rotation = factory.createRotationEffect();
rotation.setBy(90f);
rotation.getTiming().setDuration(2f);
effect.getBehaviors().add(rotation);
presentation.save("rotation.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
rotation.pptx egy alakzatot és egy forgatás viselkedést tartalmaz. Az alábbi példák a gyűjteményt, az időzítést és a forgatás szerkesztését e fájlra építik.
Méretezés
Használja a createScaleEffect metódust X/Y százalékokkal: a getFrom és a getTo a kezdő- és végméretet írják le, míg a getBy egy relatív változást ad meg. Itt a 100 az eredeti méretet jelenti.
A példa a két dimenziót 100 %‑ról 125 %‑ra növeli két másodperc alatt. Az egyenlő vízszintes és függőleges százalékok megőrzik az alakzat arányait; eltérő százalékok az egyik dimenziót jobban nyújtják, mint a másikat.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.GrowShrink, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
IScaleEffect scale = factory.createScaleEffect();
scale.setFrom(new Point2D.Float(100, 100));
scale.setTo(new Point2D.Float(125, 125));
scale.getTiming().setDuration(2f);
effect.getBehaviors().add(scale);
presentation.save("scale.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Szín
Használja a createColorEffect metódust a kitöltés kékből narancssárgába történő változtatásához. A getFrom és a getTo színek; a getBy egy színeltolást jelent. Az IBehavior.getProperties az animált attribútumot azonosítja.
Az alakzat szilárd kitöltése kék, ami megegyezik az animáció kezdőszínével. A kitöltés‑szín attribútum kiválasztása megmondja a viselkedésnek, mely részt kell változtatni; a színvégpontok önmagukban nem határozzák meg ezt az attribútumot. A mentett effektus egy kétszekundumos átmenetet írt le narancssárgára.
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
shape.getFillFormat().setFillType(FillType.Solid);
shape.getFillFormat().getSolidFillColor().setColor(Color.BLUE);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.ChangeFillColor, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
IColorEffect color = factory.createColorEffect();
color.getProperties().add(BehaviorProperty.getFillColor().getValue());
color.getFrom().setColor(Color.BLUE);
Color orange = new Color(255, 165, 0);
color.getTo().setColor(orange);
color.getTiming().setDuration(2f);
effect.getBehaviors().add(color);
presentation.save("color.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Szűrő
Használja a createFilterEffect metódust egy törlés (wipe) kiválasztásához. A getType, a getSubtype és a getReveal a szűrőt, az irányt és azt határozza meg, hogy a shape megjelenjen‑e vagy elrejtő‑e.
Ez a példa egy két másodperces törlést konfigurál, amely a jobb‑oldali al típussal jeleníti meg az alakzatot. A szűrő beállításai a viselkedésen belül vannak, ezért a preset eredeti műveleteinek eltávolítása után állítjuk be őket.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.Wipe, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
IFilterEffect filter = factory.createFilterEffect();
filter.setType(FilterEffectType.Wipe);
filter.setSubtype(FilterEffectSubtype.Right);
filter.setReveal(FilterEffectRevealType.In);
filter.getTiming().setDuration(2f);
effect.getBehaviors().add(filter);
presentation.save("filter.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Tulajdonság
Használja a createPropertyEffect metódust az átlátszóság animálásához. A getFrom, a getTo és a getBy karakterláncok, amelyeket a getValueType és a getCalcMode értelmez. Válasszon végpontokat vagy relatív eltolást, ne állítsa be mindet egyszerre.
Itt a kiválasztott attribútum az átlátszóság, a numerikus karakterláncok 25 %‑os átlátszóságról teljes átlátszóságra változtatnak. A lineáris interpoláció fokozatos változást jelent ezen értékek között. Ha más attribútumra alkalmazza a példát, válassza ki a megfelelő értéktípust és végpontértékeket.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.Fade, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
IPropertyEffect 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(2f);
effect.getBehaviors().add(property);
presentation.save("property.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Beállítás
Használja a createSetEffect metódust a láthatóság hozzárendeléséhez a getTo segítségével. A set viselkedés nem interpolál a végpontok között.
A példa a láthatóság attribútumot választja, és a visible karakterláncot rendeli hozzá, amikor a viselkedés fut. A téglalap már látható ebben a minimális prezentációban, ezért a hozzárendelés önmagában nem feltétlenül eredményez nyilvánvaló vizuális változást. Ilyen művelet nagyobb hatás részeként hasznos, amely a shape elrejtését vagy megjelenítését is vezérli.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.Appear, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
ISetEffect set = factory.createSetEffect();
set.getProperties().add(BehaviorProperty.getStyleVisibility().getValue());
set.setTo("visible");
effect.getBehaviors().add(set);
presentation.save("set.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Parancs
Használja a createCommandEffect metódust, és konfigurálja a getType, a getCommandString és a getShapeTarget beállításokat. Helyezze a sample.wav nevű WAV felvételt a munkakönyvtárba. Ez a példa a addAudioFrameEmbedded segítségével beágyazza, és egy lejátszási parancsot csatol az audio kerethez.
Az audio keret egyszerre az effektus és a parancs célja. Ez összekapcsolja a lejátszási kérést a beágyazott felvétellel; egy parancs karakterlánc önmagában nem határozza meg, mely médiát kell vezérelni. Az effektus úgy van konfigurálva, hogy a diavetítés során kattintásra induljon.
import com.aspose.slides.*;
import java.io.FileInputStream;
import java.io.IOException;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
try (FileInputStream audioStream = new FileInputStream("sample.wav")) {
IAudioFrame audioFrame = slide.getShapes().addAudioFrameEmbedded(100, 100, 40, 40, audioStream);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(audioFrame, EffectType.MediaPlay, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
ICommandEffect command = factory.createCommandEffect();
command.setType(CommandEffectType.Call);
command.setCommandString("play");
command.setShapeTarget(audioFrame);
effect.getBehaviors().add(command);
presentation.save("command.pptx", SaveFormat.Pptx);
} catch (IOException exception) {
System.out.println("Unable to read sample.wav: " + exception.getMessage());
}
} finally {
presentation.dispose();
}
A mentés a parancsot a command.pptx fájlba írja; a felvétel nem játszódik le. Lejátszáshoz olyan diavetítőre van szükség, amely támogatja a parancsot és annak médiacélját.
A viselkedésgyűjtemény kezelése
IBehaviorCollection támogatja a add, insert, remove, és a removeAt metódusokat. Ez a példa megnyitja a rotation.pptx fájlt, hozzáad egy méretezést, a forgatás előtt helyezi el, majd eltávolítja a forgatást. Egy objektum eltávolítása és újbóli beszúrása a tárolt pozíciót módosítja másolat készítése nélkül.
A szerkesztések sorozata a gyűjteményt a forgatás–méretezés kombinációról méretezés–forgatásra, majd csak méretezésre változtatja. Az indexek az aktuális gyűjteményre vonatkoznak, ezért az eltávolítás a forgatás új indexét használja az átrendezés után. A végső felsorolás megmutatja, melyik viselkedés kerül mentésre.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation("rotation.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
IBehaviorCollection behaviors = effect.getBehaviors();
IBehaviorFactory factory = new BehaviorFactory();
IScaleEffect scale = factory.createScaleEffect();
scale.setTo(new Point2D.Float(125, 125));
scale.getTiming().setDuration(2f);
behaviors.add(scale);
behaviors.remove(scale);
behaviors.insert(0, scale);
behaviors.removeAt(1);
for (IBehavior behavior : behaviors)
System.out.println(behavior.getClass().getSimpleName());
presentation.save("collection-edited.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
A kimenet ScaleEffect: csak a méretezés marad meg. A gyűjtemény sorrendje önmagában nem ütemezi a viselkedéseket egymás után. A gyűjteményt csak akkor tisztítsa, ha az összes műveletet felül akarja írni.
A viselkedés időzítésének beállítása
IBehavior.getTiming az ITiming objektumot adja vissza, függetlenül az IEffect.getTiming‑től. Az effektus időzítése az egész effektust ütemezi; a viselkedés időzítése egy benne lévő műveletet ír le.
Időtartam, késleltetés, ismétlés és gyorsulás beállítása
Nyissa meg a rotation.pptx fájlt, és állítsa be a getDuration által meghatározott időtartamot és a getTriggerDelayTime által meghatározott késleltetést másodpercben, majd a setRepeatCount segítségével adja meg az ismétlésszámot. A getAccelerate és a getDecelerate a teljes időtartam töredékei; a kettő összegének legfeljebb 1‑nek kell lennie.
A bemeneti fájl a forgatás példában létrehozott, ahol az első viselkedés ismert forgatás. Ez a példa csak az adott viselkedés időzítését módosítja; a 90‑fokos szög változatlan marad. A szög és az időzítés külön kezelése egyszerűbbé teszi a tempó finomhangolását anélkül, hogy újraépítené az animációt.
import com.aspose.slides.*;
Presentation presentation = new Presentation("rotation.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
IRotationEffect rotation = (IRotationEffect)effect.getBehaviors().get_Item(0);
rotation.getTiming().setDuration(2f);
rotation.getTiming().setTriggerDelayTime(0.5f);
rotation.getTiming().setRepeatCount(3f);
rotation.getTiming().setAccelerate(0.2f);
rotation.getTiming().setDecelerate(0.2f);
presentation.save("timing.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
A viselkedés két másodperces időtartamot, fél másodperces késleltetést és 3‑as ismétlésszámot használ. Az időtartam első és utolsó 20 %-a a gyorsulásra és lassulásra van fenntartva.
Más ismétlési szabályok a getRepeatDuration, a getRepeatUntilEndSlide és a getRepeatUntilNextClick metódusok. Válasszon egy szabályt, ahelyett, hogy mindet egyszerre engedélyezné. A getAutoReverse az animációt visszafelé játssza le a előrehaladás után. A gyorsulás és lassulás folytonos változásokra vonatkozik, nem pedig diszkrét hozzárendelésekre vagy parancsokra.
Mozgásútvonal létrehozása
Használja a createMotionEffect metódust mozgás létrehozásához. A getFrom, a getTo és a getBy százalékos koordinátákat vagy eltolásokat írnak le. Szerkeszthető útvonalhoz hozza létre a MotionPath objektumot, és rendelje hozzá az IMotionEffect.setPath metódussal. Az IMotionPath tárolja az útparancsokat.
MotionCommandPathType a műveletet választja ki:
| Parancs | Pontok | Jelentés |
|---|---|---|
| MoveTo | Egy | Állítsa be a kiindulási pozíciót. |
| LineTo | Egy | Mozogjon egy egyenes szakaszon a végpontjáig. |
| CurveTo | Három | Kövesse a két vezérlőpontot és egy végpontot tartalmazó köbös ívet. |
| CloseLoop | Nincs | Térjen vissza a kiindulási pozícióba. |
| End | Nincs | Fejezze be az útvonalat. |
MotionPathPointsType a pontok szerkesztési jellemzőit írja le, például sarkos vagy sima pontokat. Nem helyettesíti a parancstípust. A görbe példához használjon curve ponttípust, a egyenes szakaszokhoz corner ponttípust.
Az útvonal koordinátái a dia méreteihez vannak normalizálva: a 0,25‑os X‑eltolás a dia szélességének egy negyedét jelenti, nem 0,25 pontot. A pozitív Y lefelé mutat. Az abszolút parancsok a path koordinátrendszerben lévő pozíciókat adnak meg; a relatív parancsok a jelenlegi pozícióhoz képest adnak eltolást. Ez különbözik a getOrigin‑tól, amely a path referenciakeretét választja, és a getPathEditMode‑tól, amely azt szabályozza, hogyan mozog a path, amikor az alakzatot mozgatják.
Egyenes útvonal létrehozása
Hozzon létre egy mozgás viselkedést kiinduló ponttal, egy egyenes szakaszzal és egy befejező parancssal. Az IMotionPath.add a parancstípust, a pontjait, a ponttípust és a relatív‑koordináta‑jelzőt veszi fel.
A kezdő parancs (0, 0)-t állít be, a vonal (0, 0)‑ból (0,25, 0)-ba végződik, ami a dia szélességének egy negyedét adja meg vízszintesen. A befejező parancsnak nincs koordinátapontja. Miután az útvonal hozzárendelésre került, a mozgás viselkedés hozzáadása az effektushoz összeköti ezt az útvonalat a téglalappal.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
IEffect effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.PathRight, EffectSubtype.None, EffectTriggerType.OnClick);
effect.getBehaviors().clear();
IBehaviorFactory factory = new BehaviorFactory();
IMotionEffect motion = factory.createMotionEffect();
motion.setOrigin(MotionOriginType.Layout);
motion.getTiming().setDuration(2f);
IMotionPath path = new MotionPath();
path.add(MotionCommandPathType.MoveTo, new Point2D.Float[] { new Point2D.Float(0, 0) }, MotionPathPointsType.Auto, false);
path.add(MotionCommandPathType.LineTo, new Point2D.Float[] { new Point2D.Float(0.25f, 0) }, MotionPathPointsType.Corner, false);
path.add(MotionCommandPathType.End, new Point2D.Float[0], MotionPathPointsType.None, false);
motion.setPath(path);
effect.getBehaviors().add(motion);
presentation.save("motion.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
motion.pptx egy mozgás viselkedést tartalmaz három útparancsával. Az alábbi fájl‑szerkesztő példák ezt a felépítést használják.
Abszolút és relatív koordináták összehasonlítása
Ez a két útvonal ugyanazt az útvonalat írja le. Az abszolút parancs (0,3, 0,1)-re végződik; a relatív parancs (0,1, 0,1)-et ad hozzá a jelenlegi pozícióhoz, amely (0,2, 0)-t jelent.
Mindkét útvonal ugyanott indul. Relatív vonal esetén adja hozzá az X és Y eltolásokat a jelenlegi pozícióhoz a végpont meghatározásához; abszolút vonal esetén közvetlenül olvassa le a végpontot. A jelző átkapcsolása koordináta‑konverzió nélkül más útvonalat eredményezne.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
MotionPath absolutePath = new MotionPath();
absolutePath.add(MotionCommandPathType.MoveTo, new Point2D.Float[] { new Point2D.Float(0.2f, 0) }, MotionPathPointsType.Auto, false);
absolutePath.add(MotionCommandPathType.LineTo, new Point2D.Float[] { new Point2D.Float(0.3f, 0.1f) }, MotionPathPointsType.Corner, false);
MotionPath relativePath = new MotionPath();
relativePath.add(MotionCommandPathType.MoveTo, new Point2D.Float[] { new Point2D.Float(0.2f, 0) }, MotionPathPointsType.Auto, false);
relativePath.add(MotionCommandPathType.LineTo, new Point2D.Float[] { new Point2D.Float(0.1f, 0.1f) }, MotionPathPointsType.Corner, true);
Rendelje az egyik vagy a másik útvonalat egy mozgás viselkedéshez, hogy prezentációban használja. Az utolsó Boolean argumentum a relatív koordinátákat választja ki az adott parancshoz.
Vonal cseréje görbére
Nyissa meg a motion.pptx fájlt, és cserélje le a vonal parancsot egy köbös görbére. Előbb adja meg a két vezérlőpontot, majd a végpontot.
A kezdő pozíciót az előző parancs adja. Az első két pont alakítja a görbét, a harmadik a célpont; nem három egymást követő célpontról van szó. A parancstípus, a pont‑szerkesztési típus és a ponttömb egyidejű frissítése biztosítja, hogy a szegmens összhangban maradjon az új geometriával.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation("motion.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
IMotionEffect motion = (IMotionEffect)effect.getBehaviors().get_Item(0);
IMotionPath path = motion.getPath();
path.get_Item(1).setCommandType(MotionCommandPathType.CurveTo);
path.get_Item(1).setPointsType(MotionPathPointsType.CurveSmooth);
path.get_Item(1).setPoints(new Point2D.Float[] { new Point2D.Float(0.1f, 0), new Point2D.Float(0.2f, 0.1f), new Point2D.Float(0.3f, 0.1f) });
presentation.save("curve.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
A curve.pptx útvonala még mindig három parancsból áll; a középső parancs most már egy görbét definiál.
Mentett útvonal vizsgálata és szerkesztése
Minden IMotionCmdPath a getPoints, a getCommandType, a getPointsType és az isRelative metódusokat biztosítja. Az alábbi példák a motion.pptx három‑parancsos útvonalra épülnek. Tetszőleges bemenetre előbb határozza meg a kívánt effektust, és ellenőrizze a parancstípusokat és a pontszámokat index szerint történő szerkesztés előtt.
Parancsok és koordináták olvasása
Olvassa be az útvonalat módosítás nélkül. A befejező és a close‑loop parancsoknak nincs pontja, ezért egy null ponttömböt kell kezelni.
A kimenet minden numerikus parancstípust párosít a relatív‑koordináta‑jelzőjével, mielőtt felsoroznák a pontokat. Ez lehetővé teszi a végpont és az eltolás megkülönböztetését az útvonal módosítása előtt. Egy görbe három pontot, egy egyenes vonal csak egyet tartalmaz.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation("motion.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
IMotionEffect motion = (IMotionEffect)effect.getBehaviors().get_Item(0);
IMotionPath path = motion.getPath();
for (IMotionCmdPath segment : path)
{
System.out.println(segment.getCommandType() + ", relative: " + segment.isRelative());
if (segment.getPoints() != null)
for (Point2D.Float point : segment.getPoints())
System.out.println("X=" + point.x + ", Y=" + point.y);
}
} finally {
presentation.dispose();
}
A felsorolás egy kiinduló pontot, egy abszolút vonalat (0,25, 0) végződéssel és egy befejező parancsot tartalmaz.
Végpont módosítása
Nyissa meg a motion.pptx fájlt, és cserélje le a vonal ponttömbjét, hogy a végpontot elmozdítsa.
A bemeneti fájlban a 0‑s index a kiindulási parancs, az 1‑es index a vonal. A vonal egyetlen pontjának cseréje megváltoztatja a célpontot anélkül, hogy a parancstípust, az időzítést vagy a gyűjteményben elfoglalt helyet módosítaná. Mivel a parancs abszolút koordinátákat használ, az új pár egy pozíciót ad meg, nem egy hozzáadott eltolást.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation("motion.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
IMotionEffect motion = (IMotionEffect)effect.getBehaviors().get_Item(0);
motion.getPath().get_Item(1).setPoints(new Point2D.Float[] { new Point2D.Float(0.4f, 0.1f) });
presentation.save("motion-endpoint.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
A motion-endpoint.pptx fájlban a vonal (0,4, 0,1)-re végződik; az eredeti fájl változatlan marad.
Szegmens cseréje
Használja az insert és a removeAt metódusokat a motion.pptx vonalának cseréjéhez. Az beszúrás eltolja a régi vonalat a 2‑es indexre.
Ez azt mutatja be, hogy egy parancsobjektumot cserélünk, ahelyett, hogy a meglévő koordinátákat szerkesztenénk. Beszúrás után a gyűjtemény ideiglenesen a kiindulási parancsot, az új vonalat, a régi vonalat és a befejező parancsot tartalmazza. A 2‑es index eltávolítása a régi vonalat eldobja, és a új útvonal marad.
import com.aspose.slides.*;
import java.awt.geom.Point2D;
Presentation presentation = new Presentation("motion.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
IMotionEffect motion = (IMotionEffect)effect.getBehaviors().get_Item(0);
IMotionPath path = motion.getPath();
path.insert(1, MotionCommandPathType.LineTo, new Point2D.Float[] { new Point2D.Float(0.2f, 0.1f) }, MotionPathPointsType.Corner, false);
path.removeAt(2);
presentation.save("motion-edited.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
A mentett útvonal továbbra is három parancsból áll, az új vonal (0,2, 0,1)-re végződik, a befejező parancs pedig utoljára áll.
Meglévő viselkedés módosítása és ellenőrzése
Ha a viselkedés indexe ismeretlen, válassza ki típus szerint. Ez a példa megnyitja a rotation.pptx fájlt, megtalálja az IRotationEffect‑t, módosítja a szöget, majd a megnyitás után ellenőrzi a mentett értéket.
A típusellenőrzés lehetővé teszi, hogy a ciklus átugorja a nem forgató viselkedéseket. A második betöltés a mentett fájlt egy külön prezentációobjektumba olvassa be, így az összehasonlítás a tartós adatokat ellenőrzi, nem a memóriában még lévő értéket. A példa továbbra is azt feltételezi, hogy a ismert effektus az első a fő szekvenciában; típus szerint történő kiválasztás nem feltétlenül találja meg a helyes effektust tetszőleges prezentációban.
import com.aspose.slides.*;
Presentation presentation = new Presentation("rotation.pptx");
try {
IEffect effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
for (IBehavior behavior : effect.getBehaviors())
{
if (behavior instanceof IRotationEffect) {
IRotationEffect rotation = (IRotationEffect) behavior;
rotation.setBy(180f);
}
}
presentation.save("rotation-edited.pptx", SaveFormat.Pptx);
Presentation reopened = new Presentation("rotation-edited.pptx");
try {
IEffect savedEffect = reopened.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
for (IBehavior behavior : savedEffect.getBehaviors())
{
if (behavior instanceof IRotationEffect) {
IRotationEffect rotation = (IRotationEffect) behavior;
System.out.println("Rotation preserved: " + (Math.abs(rotation.getBy() - 180f) < 0.001f));
}
}
} finally {
reopened.dispose();
}
} finally {
presentation.dispose();
}
A kimenet Rotation preserved: true. Alkalmazza ugyanazt a típus‑ellenőrzési mintát más viselkedésekre is. Teljes megőrzés ellenőrzéséhez hasonlítsa össze a célalakzatot, az effektust, a viselkedéstípusokat és azok sorrendjét, az időzítést, valamint az útparancsokat. Lebegőpontos értékekhez használjon numerikus toleranciát. Ismeretlen animációs elrendezésű prezentáció esetén tekintse meg a Read Shape Animations útmutatót a fő és interaktív szekvenciák bejárásához.
Viselkedés sorrend, előre beállítottak és lejátszás
Az IBehaviorCollection sorrendje az effektus műveleteinek tárolt sorrendje. Nem egy lejátszási lista, ahol minden viselkedés automatikusan vár a megelőzőre. Az időzítés és a körülötte lévő effektus határozza meg az ütemezést. A viselkedések átfedhetnek, és ugyanazon tulajdonságra vonatkozó műveletek getAdditive és getAccumulate révén kölcsönhatásba léphetnek. Ne csak a gyűjtemény újrarendezésével ütemezze a „mozgatás, majd forgatás” szekvenciát; használjon explicit időzítést vagy külön effektusokat, ahogyan a Shape Animation leírásában szerepel.
Az effektus getType és getSubtype a presetet írja le. Ezek nem adnak teljes leírást a szerkesztett viselkedésfáról. Válassza ki a presetet és az al típust, mielőtt testreszabná a viselkedéseket: a preset megváltoztatása újraépítheti a gyűjteményt, és eldobhatja az egyedi műveleteket. Például egy testreszabott Spin effektus Fade‑re módosítása felcserélheti a forgatás viselkedést set és filter viselkedésekkel. Módosítás után ellenőrizze újra a gyűjteményt. A preset viselkedések törlése eltávolíthatja a preset által igényelt láthatósági vagy inicializációs műveleteket. A példák szándékosan látható alakzatokat használnak, és a viselkedéseket helyettesítik; nem építik újra minden preset teljes megvalósítását.
Formátumkompatibilitás
Egy megőrzött viselkedésfa nem garantálja az azonos lejátszást minden megjelenítőben vagy exportálási renderelőben. Ellenőrizze a mentett adatokat és a renderelt kimenetet külön-külön.
| Formátum vagy kimenet | Mit kell ellenőrizni |
|---|---|
| PPTX | Elsődleges formátumként használja ezeket a példákat. Nyissa meg újra a szerkeszthető viselkedésfát ellenőrizni, majd ellenőrizze a lejátszást a kívánt PowerPoint verzióban. |
| PPT | Az örökölt bináris reprezentáció eltérhet a PPTX‑től. Teszteljen külön mentés‑újranyitás ciklust és lejátszást; ne vonjon le általános támogatást minden egyedi kombinációra a sikeres PPTX‑kimenet alapján. |
| PDF, PNG, JPEG és egyéb statikus dia‑képek | Statikus diaábrázolást tartalmaznak, nem tartalmaznak lejátszható viselkedésidővonalat vagy garantált végső animációs képkockát. |
| HTML5 | Lejátszhatja a támogatott animációkat, ha a shape animation engedélyezve van az export beállításaiban. Tesztelje az egyedi kombinációkat a böngészőben. |
| Animated GIF | Renderelt képkockákat tárol, nem szerkeszthető viselkedéseket vagy kattintás‑indított interakciót. Ellenőrizze a tényleges renderelt mozgást. |
| Video | Animációs képkockákat renderel és videóként kódolja. A támogatás a renderelő supported animations and effects listájára korlátozódik; a parancsok és interaktív események nem válnak szerkeszthető idővonalákká. |
GYIK
Miért tartalmaz az effektus viselkedéseket, mielőtt én bármelyiket hozzáadnám?
Egy előre definiált effektus létrehozása létrehozhatja a mögöttes műveleteket. Vizsgálja meg őket, mielőtt eldöntené, hogy a presetet kibővíti vagy a viselkedéseket lecseréli.
A viselkedés elejére helyezése biztosan elsőként játssza le?
Nem feltétlenül. A gyűjtemény sorrendje nem helyettesíti az időzítést. Ellenőrizze a késleltetéseket, az időtartamokat és a műveletek közötti kölcsönhatásokat ugyanazon tulajdonságon.
Miért nincs pontja a befejező (end) parancsnak?
Ez jelzi az útvonal végét, és nem igényel koordinátákat. Útvonal olvasásakor ellenőrizze, hogy a ponttömb null‑e.
Elég-e egy sikeres körkörös mentés‑újranyitás a lejátszás megerősítéséhez?
Nem. A újranyitás csak a ellenőrzött tulajdonságok megőrzését igazolja. A diavetítő vagy az animált export külön tesztelése szükséges a vizuális viselkedés megerősítéséhez.