Skapa och ändra anpassade animeringsbeteenden i JavaScript
Översikt
Anpassade animeringsbeteenden låter dig styra enskilda operationer inom en animationseffekt, såsom att ändra en färg, rotera en form eller följa en redigerbar rörelsebana. Den här guiden visar hur du skapar och kombinerar beteenden, konfigurerar deras timing, inspekterar och modifierar befintliga animationer samt verifierar att deras egenskaper överlever när en presentation sparas och öppnas igen.
För fördefinierade effekter och klicktriggar, se Shape Animation.
Förstå animationsmodellen
En animation är organiserad som Timeline → Sequence → Effect → Behaviors:
- Metoden getTimeline returnerar bildens tidslinje, som innehåller dess huvudsekvens och interaktiva sekvenser.
- En Sequence innehåller effekter, eventuellt riktade mot olika former.
- En Effect identifierar en målform, förinställning, undertyp och effektens timing.
- Samlingen som returneras av Effect.getBehaviors innehåller de operationer som implementerar effekten: ändra färg, flytta, rotera, sätta en egenskap osv.
Skapa enskilda beteenden
Anropa Sequence.addEffect för att skapa en effekt och komma åt samlingen getBehaviors. En förinställning kan automatiskt fylla denna samling. Behåll dess operationer när du utökar förinställningen, eller använd clear när du avsiktligt ersätter dem.
BehaviorFactory skapar de åtta beteendetyper som illustreras nedan. Rörelse behandlas i Build a Motion Path. Varje kodsnutt inkluderar sina modulimporter och kan köras som ett Node.js‑skript med paketen aspose.slides.via.java och java installerade. Kör fil‑skapande exemplen innan exemplen som läser deras utdata. Senare redigeringsexempel anger vilken utdatafil de använder.
Rotation
Använd createRotationEffect för att skapa en rotation. getBy anger en relativ vinkel i grader; getFrom och getTo specificerar slutpunkter.
Exemplet börjar med en Spin‑effekt, ersätter dess förinställda operationer med ett rotationsbeteende och ger den operationen en varaktighet på två sekunder. En relativ vinkel på 90 grader motsvarar ett kvartsväng från figurens startorientering, så ingen explicit startvinkel behövs.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Spin, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const rotation = factory.createRotationEffect();
rotation.setBy(90);
rotation.getTiming().setDuration(2);
effect.getBehaviors().add(rotation);
presentation.save("rotation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
rotation.pptx innehåller en form och ett rotationsbeteende. Samlingen, timingen och rotations‑redigerings exemplen nedan använder den här filen.
Skala
Använd createScaleEffect med X/Y‑procent: getFrom och getTo beskriver start‑ och slutstorlek, medan getBy beskriver en relativ förändring. Här betyder 100 den ursprungliga storleken.
Exemplet ökar båda dimensionerna från 100 % till 125 % under två sekunder. Att använda lika horisontella och vertikala procentsatser behåller figurens proportioner; olika procentsatser skulle sträcka en dimension mer än den andra.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.GrowShrink, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const scale = factory.createScaleEffect();
scale.setFrom(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(100), java.newFloat(100)));
scale.setTo(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(125), java.newFloat(125)));
scale.getTiming().setDuration(2);
effect.getBehaviors().add(scale);
presentation.save("scale.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Färg
Använd createColorEffect för att ändra fyllningen från blå till orange. getFrom och getTo är färger; getBy är en färgförskjutning. Behavior.getProperties identifierar attributet som animeras.
Figurens solida fyllning initieras till blå, vilket matchar animationens startfärg. Att välja fyllnings‑färg‑attributet talar om för beteendet vilken del av figuren som ska ändras; färg‑slutpunkterna ensamma identifierar inte attributet. Den sparade effekten beskriver en två sekunders övergång till orange.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
shape.getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.ChangeFillColor, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const color = factory.createColorEffect();
color.getProperties().add(aspose.slides.BehaviorProperty.getFillColor().getValue());
color.getFrom().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));
const orange = java.newInstanceSync("java.awt.Color", 255, 165, 0);
color.getTo().setColor(orange);
color.getTiming().setDuration(2);
effect.getBehaviors().add(color);
presentation.save("color.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Filter
Använd createFilterEffect för att välja en svepning. getType, getSubtype och getReveal specificerar filtret, riktningen och om figuren ska avslöjas eller döljas.
Detta exempel konfigurerar en två sekunders svepning som avslöjar figuren med undertypen för riktning åt höger. Filterinställningarna tillhör beteendet i effekten, så de konfigureras efter att förinställningens ursprungliga operationer har tagits bort.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Wipe, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const filter = factory.createFilterEffect();
filter.setType(aspose.slides.FilterEffectType.Wipe);
filter.setSubtype(aspose.slides.FilterEffectSubtype.Right);
filter.setReveal(aspose.slides.FilterEffectRevealType.In);
filter.getTiming().setDuration(2);
effect.getBehaviors().add(filter);
presentation.save("filter.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Egenskap
Använd createPropertyEffect för att animera opacitet. getFrom, getTo och getBy är strängar som tolkas med getValueType och getCalcMode. Välj slutpunkter eller en relativ förskjutning istället för att sätta alla tre godtyckligt.
Här är det valda attributet opacitet, och de numeriska strängarna representerar en förändring från 25 % opacitet till full opacitet. Linjär interpolation beskriver en gradvis förändring mellan dessa värden. När du anpassar detta exempel till ett annat attribut, välj en värdetyp och slutvärden som är lämpliga för det attributet.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Fade, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const property = factory.createPropertyEffect();
property.getProperties().add(aspose.slides.BehaviorProperty.getStyleOpacity().getValue());
property.setValueType(aspose.slides.PropertyValueType.Number);
property.setCalcMode(aspose.slides.PropertyCalcModeType.Linear);
property.setFrom("0.25");
property.setTo("1");
property.getTiming().setDuration(2);
effect.getBehaviors().add(property);
presentation.save("property.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Set
Använd createSetEffect för att tilldela synlighet via getTo. Ett set‑beteende interpolerar inte mellan slutpunkterna.
Exemplet väljer synlighetsattributet och tilldelar strängen visible när beteendet körs. Rektangeln är redan synlig i den här minimala presentationen, så tilldelningen kanske inte ger någon uppenbar visuell förändring på egen hand. En sådan operation är användbar som en del av en större effekt som också styr när figuren blir dold eller synlig.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const set = factory.createSetEffect();
set.getProperties().add(aspose.slides.BehaviorProperty.getStyleVisibility().getValue());
set.setTo("visible");
effect.getBehaviors().add(set);
presentation.save("set.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Kommando
Använd createCommandEffect och konfigurera getType, getCommandString och getShapeTarget. Placera en WAV‑inspelning med namnet sample.wav i arbetskatalogen. Detta exempel bäddar in den med addAudioFrameEmbedded och bifogar ett spel‑kommando till ljud‑ramen.
Ljud‑ramen är både effektens mål och kommandots mål. Detta kopplar uppspelningsbegäran till den inbäddade inspelningen; en kommandosträng i sig identifierar inte vilket medieobjekt som ska kontrolleras. Effekten konfigureras att starta vid ett klick under bildspelet.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const audioStream = java.newInstanceSync("java.io.FileInputStream", "sample.wav");
try {
const audioFrame = slide.getShapes().addAudioFrameEmbedded(100, 100, 40, 40, audioStream);
const effect = slide.getTimeline().getMainSequence().addEffect(audioFrame, aspose.slides.EffectType.MediaPlay, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const command = factory.createCommandEffect();
command.setType(java.newByte(aspose.slides.CommandEffectType.Call));
command.setCommandString("play");
command.setShapeTarget(audioFrame);
effect.getBehaviors().add(command);
presentation.save("command.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
audioStream.close();
}
} finally {
presentation.dispose();
}
Sparande lagrar kommandot i command.pptx; det spelar inte upp inspelningen. Uppspelning kräver en bildspels‑spelare som stödjer kommandot och dess mediamål.
Hantera beteendesamlingen
BehaviorCollection stöder add, insert, remove och removeAt. Detta exempel öppnar rotation.pptx, lägger till skalning, flyttar den före rotation och tar bort rotationen. Att ta bort och återinfoga samma objekt ändrar dess lagrade position utan att göra en kopia.
Redigeringssekvensen ändrar samlingen från rotation–skala till skala–rotation och sedan till endast skala. Index refererar till den aktuella samlingen, så borttagningen använder rotationens nya index efter omordning. Den sista uppräkningen bekräftar vilket beteende som kommer att sparas.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
const behaviors = effect.getBehaviors();
const factory = new aspose.slides.BehaviorFactory();
const scale = factory.createScaleEffect();
scale.setTo(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(125), java.newFloat(125)));
scale.getTiming().setDuration(2);
behaviors.add(scale);
behaviors.remove(scale);
behaviors.insert(0, scale);
behaviors.removeAt(1);
for (let i = 0; i < behaviors.getCount(); i++) {
const behavior = behaviors.get_Item(i);
console.log(behavior.getClass().getSimpleName());
}
presentation.save("collection-edited.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Utdata är ScaleEffect: endast skalning kvarstår. Samlingsordning schemalägger i sig inte beteenden ett efter ett. Rensa samlingen endast när du ersätter alla dess operationer.
Konfigurera beteendetiming
Behavior.getTiming visar Timing, oberoende av Effect.getTiming. Effekt‑timing schemalägger den omslutande effekten; beteende‑timing beskriver en operation inuti den.
Ställ in varaktighet, fördröjning, upprepning och acceleration
Öppna rotation.pptx och ange varaktigheten (getDuration) och trigger‑fördröjningen (getTriggerDelayTime) i sekunder, konfigurera sedan repetitionsantalet via setRepeatCount. getAccelerate och getDecelerate är bråkdelar av varaktigheten; håll deras summa högst 1.
Indatafilen är den som skapades i rotations‑exemplet, där det första beteendet är känt att vara en rotation. Detta exempel ändrar endast det beteendets timing; dess 90‑graders vinkel förblir intakt. Att hålla vinkel och timing separata gör det lättare att justera takten utan att bygga om animationen.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
const rotation = effect.getBehaviors().get_Item(0);
rotation.getTiming().setDuration(2);
rotation.getTiming().setTriggerDelayTime(java.newFloat(0.5));
rotation.getTiming().setRepeatCount(3);
rotation.getTiming().setAccelerate(java.newFloat(0.2));
rotation.getTiming().setDecelerate(java.newFloat(0.2));
presentation.save("timing.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Beteendet använder en varaktighet på två sekunder, en fördröjning på en halv sekund och ett repetitionsantal på 3. De första och sista 20 % av varaktigheten används för acceleration och retardation.
Andra repetitionspolicyer inkluderar getRepeatDuration, getRepeatUntilEndSlide och getRepeatUntilNextClick; välj en policy istället för att aktivera dem alla samtidigt. getAutoReverse spelar animationen baklänges efter den framåtgående passagen. Acceleration och retardation gäller för kontinuerliga förändringar, inte diskreta tilldelningar eller kommandon.
Skapa en rörelsebana
Använd createMotionEffect för att skapa rörelse. Dess getFrom, getTo och getBy beskriver procentbaserade koordinater eller förskjutningar. För en redigerbar rutt, skapa en MotionPath och tilldela den med MotionEffect.setPath. MotionPath lagrar ban‑kommandona.
| Kommando | Punkter | Betydelse |
|---|---|---|
| MoveTo | En | Ange startpositionen. |
| LineTo | En | Flytta längs ett rakt segment till dess slutpunkt. |
| CurveTo | Tre | Följ en kubisk kurva definierad av två kontrollpunkter och en slutpunkt. |
| CloseLoop | Ingen | Återgå till startpositionen. |
| End | Ingen | Avsluta banan. |
MotionPathPointsType beskriver egenskaper för punktredigering, såsom hörnpunkter eller släta punkter. Den ersätter inte kommandotypen. Använd en kurvpunkttyp för kurvexemplet nedan och en hörnpunkttyp för de raka segmenten.
Bannkoordinater normaliseras till bildens dimensioner: en X‑förskjutning på 0,25 motsvarar en fjärdedel av bildens bredd, inte 0,25 punkter. Positiv Y går nedåt. Absoluta kommandon specificerar positioner i ban‑koordinatsystemet; relativa kommandon specificerar förskjutningar från den aktuella positionen. Detta är separat från getOrigin, som väljer banans referensram, och getPathEditMode, som styr hur banan rör sig när figuren flyttas.
Skapa en rak bana
Skapa ett rörelsesbeteende med en startpunkt, ett rakt segment och ett slutkommando. MotionPath.add tar kommandotypen, dess punkter, punkttypen och en flagga för relativ koordinat.
Startkommandot fastställer (0, 0) och linjen slutar vid (0,25, 0), vilket ger rutten en horisontell förskjutning på en fjärdedel av bildens bredd. Slutkommandot har inga koordinatpunkter. När banan har tilldelats, kopplar tillägg av rörelsesbeteendet till effekten den rutten till rektangeln.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.PathRight, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
effect.getBehaviors().clear();
const factory = new aspose.slides.BehaviorFactory();
const motion = factory.createMotionEffect();
motion.setOrigin(aspose.slides.MotionOriginType.Layout);
motion.getTiming().setDuration(2);
const path = new aspose.slides.MotionPath();
path.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
path.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.25), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Corner, false);
path.add(aspose.slides.MotionCommandPathType.End, java.newArray("java.awt.geom.Point2D$Float", []), aspose.slides.MotionPathPointsType.None, false);
motion.setPath(path);
effect.getBehaviors().add(motion);
presentation.save("motion.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
motion.pptx innehåller ett rörelsesbeteende med tre ban‑kommandon. Följande fil‑redigeringsexempel använder denna kända struktur.
Jämför absoluta och relativa koordinater
Dessa två ban‑objekt beskriver samma rutt. Det absoluta kommandot slutar vid (0,3, 0,1); det relativa kommandot lägger till (0,1, 0,1) till den aktuella positionen, (0,2, 0).
Båda banorna startar på samma position. För den relativa linjen, lägg till dess X‑ och Y‑förskjutningar till den aktuella positionen för att få slutpunkten; för den absoluta linjen, läs slutpunkten direkt. Att byta flaggan utan att konvertera koordinaterna skulle beskriva en annan rutt.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const absolutePath = new aspose.slides.MotionPath();
absolutePath.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
absolutePath.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.3), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, false);
const relativePath = new aspose.slides.MotionPath();
relativePath.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
relativePath.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.1), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, true);
Tilldela antingen banan till ett rörelsesbeteende för att använda den i en presentation. Det sista booleska argumentet väljer relativa koordinater för det kommandot.
Ersätt en linje med en kurva
Öppna motion.pptx och ersätt dess linjekommando med en kubisk kurva. Ange först de två kontrollpunkterna, följt av slutpunkten.
Startpositionen levereras av föregående kommando. De två första punkterna formar kurvan, medan den tredje är dess destination; de är inte tre på varandra följande destinationer. Att uppdatera kommandotyp, punkttyp och punktarray samtidigt håller segmentet konsekvent med dess nya geometri.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("motion.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
const motion = effect.getBehaviors().get_Item(0);
const path = motion.getPath();
path.get_Item(1).setCommandType(aspose.slides.MotionCommandPathType.CurveTo);
path.get_Item(1).setPointsType(aspose.slides.MotionPathPointsType.CurveSmooth);
path.get_Item(1).setPoints(java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.1), java.newFloat(0)), java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0.1)), java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.3), java.newFloat(0.1))]));
presentation.save("curve.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Banan i curve.pptx har fortfarande tre kommandon; dess mellersta kommando definierar nu en kurva.
Inspektera och redigera en sparad bana
Varje MotionCmdPath visar getPoints, getCommandType, getPointsType och isRelative. Följande exempel använder den kända tre‑kommandonsbanan i motion.pptx. För godtycklig indata, lokalisera den avsedda effekten och kontrollera kommandotyper och punktantal innan du redigerar efter index.
Läs kommandon och koordinater
Läs banan utan att ändra den. Slut‑ och close‑loop‑kommandon kräver inga punkter, så tillåt en null‑punktarray.
Utdata parar ihop varje numerisk kommandotyp med dess flagga för relativ koordinat innan punkterna listas. Detta låter dig särskilja en slutpunkt från en förskjutning innan du modifierar banan. En kurva skulle lista tre punkter, medan den raka linjen i den här filen listar endast en.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("motion.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
const motion = effect.getBehaviors().get_Item(0);
const path = motion.getPath();
for (let i = 0; i < path.getCount(); i++) {
const segment = path.get_Item(i);
console.log(segment.getCommandType() + ", relative: " + segment.isRelative());
const points = segment.getPoints();
if (points != null) {
for (const point of points) {
console.log("X=" + point.getX() + ", Y=" + point.getY());
}
}
}
} finally {
presentation.dispose();
}
Listan innehåller en startpunkt, en absolut linje som slutar vid (0,25, 0) och ett slutkommando.
Ändra en slutpunkt
Öppna motion.pptx och ersätt linjens punktarray för att flytta dess slutpunkt.
I indatafilen är index 0 startkommandot och index 1 linjen. Att ersätta linjens enda punkt ändrar dess destination utan att ändra kommandotyp, timing eller position i samlingen. Eftersom kommandot använder absoluta koordinater specificerar det nya paret en position snarare än en tillagd förskjutning.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("motion.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
const motion = effect.getBehaviors().get_Item(0);
motion.getPath().get_Item(1).setPoints(java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.4), java.newFloat(0.1))]));
presentation.save("motion-endpoint.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Linjen i motion-endpoint.pptx slutar vid (0,4, 0,1); den ursprungliga filen är oförändrad.
Ersätt ett segment
Använd insert och removeAt för att ersätta linjen i motion.pptx. Infogning förskjuter den gamla linjen till index 2.
Detta demonstrerar att ersätta ett kommandobjekt snarare än att redigera dess befintliga koordinater. Efter infogning innehåller samlingen tillfälligt startkommandot, den nya linjen, den gamla linjen och slutkommandot. Borttagning av index 2 kastar den gamla linjen och lämnar den nya rutten på plats.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("motion.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
const motion = effect.getBehaviors().get_Item(0);
const path = motion.getPath();
path.insert(1, aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, false);
path.removeAt(2);
presentation.save("motion-edited.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Den sparade banan har fortfarande tre kommandon, där den nya linjen slutar vid (0,2, 0,1) och slutkommandet är sist.
Modifiera och verifiera ett befintligt beteende
När beteendets index är okänt, välj det efter typ. Detta exempel öppnar rotation.pptx, hittar dess RotationEffect, ändrar vinkeln och kontrollerar det sparade värdet efter att filen öppnats igen.
Typkontrollen låter loopen hoppa över beteenden som inte är rotationer. Den andra inläsningen läser den sparade filen till ett separat presentationsobjekt, så jämförelsen kontrollerar bestående data snarare än värdet som fortfarande ligger i minnet. Detta exempel förutsätter fortfarande att den kända effekten är den första i huvudsekvensen; att välja ett beteende efter typ hittar inte rätt effekt i en godtycklig presentation.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
for (let i = 0; i < effect.getBehaviors().getCount(); i++) {
const behavior = effect.getBehaviors().get_Item(i);
if (java.instanceOf(behavior, "com.aspose.slides.IRotationEffect")) {
const rotation = behavior;
rotation.setBy(180);
}
}
presentation.save("rotation-edited.pptx", aspose.slides.SaveFormat.Pptx);
const reopened = new aspose.slides.Presentation("rotation-edited.pptx");
try {
const savedEffect = reopened.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
for (let i = 0; i < savedEffect.getBehaviors().getCount(); i++) {
const behavior = savedEffect.getBehaviors().get_Item(i);
if (java.instanceOf(behavior, "com.aspose.slides.IRotationEffect")) {
const rotation = behavior;
console.log("Rotation preserved: " + (Math.abs(rotation.getBy() - 180) < 0.001));
}
}
} finally {
reopened.dispose();
}
} finally {
presentation.dispose();
}
Utdata är Rotation preserved: true. Applicera samma typ‑kontrollmönster på andra beteenden. För en fullständig bevarande‑kontroll, jämför målformen, effekten, beteendetyperna och ordningen, timing och ban‑kommandon. Använd ett numeriskt toleransintervall för flyttal. För en presentation med okänt animations‑layout, se Read Shape Animations för genomgång av huvud‑ och interaktiva sekvenser.
Beteendeordning, förinställningar och uppspelning
Ordningen i BehaviorCollection är den lagrade ordningen för en effektens operationer. Det är inte en spellista där varje beteende automatiskt väntar på föregående. Timing och den omslutande effekten bestämmer schemaläggning. Beteenden kan överlappa, och operationer på samma egenskap kan samverka via getAdditive och getAccumulate. Använd inte endast omläggning av samlingen för att schemalägga ”flytta, sedan rotera”; använd explicit timing eller separata effekter som beskrivs i Shape Animation.
Effektens getType och getSubtype beskriver dess förinställning. De är inte en fullständig beskrivning av ett redigerat beteendeträd. Välj förinställning och undertyp innan du anpassar beteenden: att ändra förinställningen kan bygga om samlingen och kassera dina egna operationer. Till exempel kan byte av en anpassad Spin‑effekt till Fade ersätta dess rotationsbeteende med set‑ och filter‑beteenden. Inspektera samlingen igen efter att du ändrat en förinställning eller undertyp. Rensning av förinställnings‑beteenden kan också ta bort synlighets‑ eller initierings‑operationer som förinställningen kräver. Exemplen använder avsiktligt synliga former och ersätter beteendena; de rekonstruerar inte varje förinställnings implementering.
Formatkompatibilitet
Ett bevarat beteendeträd garanterar inte identisk uppspelning i varje visare eller export‑renderare. Kontrollera sparade data och den renderade utdata separat.
| Format eller output | Vad att verifiera |
|---|---|
| PPTX | Använd som primärt format för dessa exempel. Öppna den igen för att verifiera det redigerbara beteendeträdet, och kontrollera sedan uppspelning i den avsedda PowerPoint‑versionen. |
| PPT | Äldre binär representation kan skilja sig från PPTX. Testa en separat spara‑och‑öppna‑cykel och uppspelning; dra inte slutsatsen att alla anpassade kombinationer stöds bara för att PPTX‑utdata lyckas. |
| PDF, PNG, JPEG och andra statiska bild‑bilder | Innehåller en statisk bildrepresentation, inte en spelbar beteendetidslinje eller en garanterad slut‑animationsram. |
| HTML5 | Kan spela stödjade animationer när form‑animation är aktiverad i exportalternativen. Testa anpassade kombinationer i webbläsaren. |
| Animated GIF | Lagras renderade ramar, inte redigerbara beteenden eller klick‑utlösta interaktioner. Kontrollera den faktiska renderade rörelsen. |
| Video | Renderar animationsramar och kodar dem som video. Stödet är begränsat till renderarens supported animations and effects; kommandon och interaktiva händelser blir inte en redigerbar tidslinje. |
FAQ
Varför innehåller min effekt beteenden innan jag har lagt till några?
Att skapa en fördefinierad effekt kan skapa dess underliggande operationer. Inspektera dem innan du bestämmer dig för att utöka förinställningen eller ersätta dess beteenden.
Gör att flytta ett beteende till början att det spelas först?
Inte nödvändigtvis. Samlingsordning är ingen ersättning för timing. Kontrollera fördröjningar, varaktigheter och interaktioner mellan operationer på samma egenskap.
Varför har ett slutkommando inga punkter?
Det markerar slutet på banan och kräver inga koordinater. Kontrollera en null‑punktarray när du inspekterar en bana läst från en fil.
Är en lyckad rundresa tillräcklig för att bekräfta uppspelning?
Nej. Att öppna igen bekräftar bevarandet av de egenskaper du kontrollerade. Testa bildspelar‑programmet eller den animerade exporten separat för att bekräfta dess visuella beteende.