Egyéni animációs viselkedések létrehozása és módosítása Pythonban Java segítségével

Áttekintés

Az egyéni animációs viselkedések lehetővé teszik, hogy egy animációs hatás egyes műveleteit szabályozza, például szín módosítását, alakzat forgatását vagy egy szerkeszthető mozgásútvonal követését. Ez az útmutató bemutatja, hogyan hozhat létre és kombinálhat viselkedéseket, konfigurálhatja azok időzítését, ellenőrizheti és módosíthatja a meglévő animációkat, valamint ellenőrizheti, hogy a tulajdonságaik megmaradnak‑e a prezentáció mentése és újranyitása után.

Előre definiált hatások és kattintásindítók esetén lásd a Alakzat animáció.

Az animációs modell megértése

Egy animáció a Timeline → Sequence → Effect → Behaviors struktúrába van szervezve:

  • A getTimeline metódus visszaadja a dia idővonalát, amely tartalmazza a fő sorozatát és az interaktív sorozatokat.
  • A Sequence tartalmaz hatásokat, esetleg különböző alakzatokra mutatva.
  • Az Effect meghatározza a célalakzatot, az előbeállítást, az alcsaládot és a hatás időzítését.
  • Az Effect.getBehaviors által visszaadott gyűjtemény tartalmazza a hatás 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.

Egyéni viselkedések létrehozása

Hívja a Sequence.addEffect metódust egy hatás létrehozásához, és érje el a getBehaviors gyűjteményt. Egy előbeállítás automatikusan feltöltheti ezt a gyűjteményt. Tartsa meg a műveleteket az előbeállítás bővítésekor, vagy használja a clear metódust, ha szándékosan felül szeretné írni őket.

BehaviorFactory létrehozza az alább illusztrált nyolc viselkedéstípust. A mozgás a Build a Motion Path című szakaszban kerül tárgyalásra. Minden kódrészlet tartalmazza a szükséges importokat, és ha kell, elindítja a JVM‑et. A Java pontobjektumok és tömbök JPype‑on keresztül jönnek létre, ahol az API megköveteli őket. A későbbi szerkesztési példák jelzik, melyik kimeneti fájlt használják.

Forgatás

Használja a createRotationEffect metódust egy 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 kezd, lecseréli annak előbeállítási műveleteit egy forgatási viselkedésre, és két másodperces időtartamot ad ennek. A 90 fokos relatív szög egy negyedfordulatot jelent a kiinduló tájolásból, így nem szükséges explicit kezdőszög.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, EffectSubtype, EffectTriggerType, EffectType, Presentation, SaveFormat, ShapeType

presentation = 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 = BehaviorFactory()
    rotation = factory.createRotationEffect()
    rotation.setBy(90)
    rotation.getTiming().setDuration(2)

    effect.getBehaviors().add(rotation)

    presentation.save("rotation.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

rotation.pptx egy alakzatot és egy forgatási viselkedést tartalmaz. Az alábbi gyűjtemény‑, időzítés‑ és forgatás‑szerkesztési példák ezt a fájlt használják.

Skálázás

Használja a createScaleEffect metódust X/Y százalékokkal: a getFrom és a getTo a kezdeti és végső méretet írja le, míg a getBy relatív változást ad meg. Itt a 100 az eredeti méretet jelenti.

A példa mindkét dimenziót 100 %‑ról 125 %‑ra növeli két másodperc alatt. Azonos vízszintes és függőleges százalékok megőrzik az alakzat arányait; eltérő százalékok az egyik dimenziót erősebben nyújtják.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, EffectSubtype, EffectTriggerType, EffectType, Presentation, SaveFormat, ShapeType

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

presentation = 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 = BehaviorFactory()
    scale = factory.createScaleEffect()
    scale.setFrom(Point2DFloat(100, 100))
    scale.setTo(Point2DFloat(125, 125))
    scale.getTiming().setDuration(2)

    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ára változtatásához. A getFrom és a getTo színek, a getBy színeltolás. A Behavior.getProperties határozza meg az animált attribútumot.

Az alakzat szilárd kitöltése kék, ami megegyezik a animáció kezdőszínével. A kitöltő‑szín attribútum kiválasztása meghatározza, melyik részt kell módosítani; a szín‑végpontok önmagukban nem határozzák meg az attribútumot. A mentett hatás két másodperces átmenetet ír le a narancssárga felé.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, BehaviorProperty, EffectSubtype, EffectTriggerType, EffectType, FillType, Presentation, SaveFormat, ShapeType

Color = jpype.JClass("java.awt.Color")

presentation = 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(Color.BLUE)

    effect = slide.getTimeline().getMainSequence().addEffect(shape, EffectType.ChangeFillColor, EffectSubtype.None_, EffectTriggerType.OnClick)
    effect.getBehaviors().clear()

    factory = BehaviorFactory()
    color = factory.createColorEffect()
    color.getProperties().add(BehaviorProperty.getFillColor().getValue())
    color.getFrom().setColor(Color.BLUE)
    color.getTo().setColor(Color(255, 165, 0))
    color.getTiming().setDuration(2)

    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 határozza meg a szűrőt, az irányt és azt, hogy a forma megjelenik‑e vagy elrejtő‑e.

Ez a példa egy jobb‑irányú alcsaládú két másodperces törlést konfigurál, amely a formát megjeleníti. A szűrőbeállítások a hatáson belüli viselkedéshez tartoznak, ezért a preset eredeti műveletei eltávolítása után kerülnek beállításra.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, EffectSubtype, EffectTriggerType, EffectType, FilterEffectRevealType, FilterEffectSubtype, FilterEffectType, Presentation, SaveFormat, ShapeType

presentation = 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 = 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("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, a háromat egyszerre nem kell mind beállítani.

Itt a kiválasztott attribútum az átlátszóság, a szám‑karakterláncok pedig a 25 %‑os átlátszóságtól a teljes átlátszóságig tartó változást jelölik. A lineáris interpoláció fokozatos változást ír le ezen értékek között. Más attribútum esetén válasszon megfelelő értéktípust és végpontértékeket.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, BehaviorProperty, EffectSubtype, EffectTriggerType, EffectType, Presentation, PropertyCalcModeType, PropertyValueType, SaveFormat, ShapeType

presentation = 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 = 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("property.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Beállítás

Használja a createSetEffect metódust a láthatóság getTo segítségével történő hozzárendeléséhez. A beállítási 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 viselkedés futásakor a visible karakterláncot rendeli hozzá. A téglalap már látható ebben a minimális prezentációban, így a hozzárendelés önmagában nem biztos, hogy nyilvánvaló vizuális változást eredményez. Az ilyen művelet egy nagyobb hatás részeként hasznos, amely egyúttal szabályozza, mikor legyen a forma rejtett vagy látható.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, BehaviorProperty, EffectSubtype, EffectTriggerType, EffectType, Presentation, SaveFormat, ShapeType

presentation = 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 = BehaviorFactory()
    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 állítsa be a getType, a getCommandString és a getShapeTarget értékeket. Egy sample.wav nevű WAV‑felvételt helyezzen a munkakönyvtárba. A példa ezt beágyazza a addAudioFrameEmbedded segítségével, és egy lejátszó parancsot kapcsol az audio‑kerethez.

Az audio‑keret egyszerre a hatás és a parancs célpontja. Így a lejátszási kérelem az beágyazott felvételhez kapcsolódik; egy puszta parancs‑sztring önmagában nem határozza meg, melyik médiaobjektumot kell vezérelni. A hatás úgy van beállítva, hogy a diavetítés során kattintásra induljon.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from pathlib import Path

from asposeslides.api import BehaviorFactory, CommandEffectType, EffectSubtype, EffectTriggerType, EffectType, Presentation, SaveFormat

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    audio_data = Path("sample.wav").read_bytes()
    audio_bytes = jpype.JArray(jpype.JByte)(audio_data)
    audio = presentation.getAudios().addAudio(audio_bytes)
    audio_frame = slide.getShapes().addAudioFrameEmbedded(100, 100, 40, 40, audio)

    effect = slide.getTimeline().getMainSequence().addEffect(audio_frame, EffectType.MediaPlay, EffectSubtype.None_, EffectTriggerType.OnClick)
    effect.getBehaviors().clear()

    factory = BehaviorFactory()
    command = factory.createCommandEffect()
    command.setType(CommandEffectType.Call)
    command.setCommandString("play")
    command.setShapeTarget(audio_frame)

    effect.getBehaviors().add(command)

    presentation.save("command.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

A mentés a parancsot a command.pptx fájlba menti; nem játssza le a felvételt. Lejátszáshoz olyan diavetítő lejátszóra van szükség, amely támogatja a parancsot és annak média‑célpontját.

A viselkedésgyűjtemény kezelése

BehaviorCollection támogatja a add, insert, remove és a removeAt műveleteket. Ez a példa megnyitja a rotation.pptx‑t, hozzáad egy skálázást, a forgatás elé helyezi, majd eltávolítja a forgatást. Ugyanazon objektum eltávolítása és újbóli beszúrása módosítja a tárolt pozíciót anélkül, hogy másolatot készítene.

A szerkesztési sorozat a gyűjteményt forgatás–skálázásról skálázás–forgatásra, végül csak skálázásra változtatja. Az indexek a aktuális gyűjteményre vonatkoznak, ezért a törlés a forgatás új indexét használja az átrendezés után. A végső felsorolás megerősíti, melyik viselkedés kerül mentésre.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, Presentation, SaveFormat

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

presentation = Presentation("rotation.pptx")
try:
    effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0)
    behaviors = effect.getBehaviors()

    factory = BehaviorFactory()
    scale = factory.createScaleEffect()
    scale.setTo(Point2DFloat(125, 125))
    scale.getTiming().setDuration(2)

    behaviors.add(scale)

    behaviors.remove(scale)
    behaviors.insert(0, scale)
    behaviors.removeAt(1)

    for behavior in behaviors:
        print(behavior.getClass().getSimpleName())

    presentation.save("collection-edited.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Az eredmény ScaleEffect: csak a skálázás maradt. A gyűjtemény sorrendje önmagában nem ütemezi a viselkedéseket egymás után. A gyűjteményt csak akkor törölje, ha az összes műveletet fel akarja cserélni.

A viselkedés időzítésének konfigurálása

Behavior.getTiming a Timing objektumot adja vissza, függetlenül az Effect.getTiming-tól. A hatás időzítése az egész hatást ütemezi; a viselkedés időzítése a benne lévő műveletet írja le.

Időtartam, késleltetés, ismétlés és gyorsulás beállítása

Nyissa meg a rotation.pptx‑t, és állítsa be az időtartamot (getDuration) valamint a trigger‑késleltetést (getTriggerDelayTime) másodpercben, majd konfigurálja az ismétlésszámot a setRepeatCount segítségével. A getAccelerate és a getDecelerate a teljes időtartam tört részei; összegük legfeljebb 1 legyen.

A bemeneti fájl a forgatás példában létrehozott fájl, ahol az első viselkedés ismert, hogy forgatás. Ez a példa csak ennek a viselkedésnek az időzítését módosítja; a 90 fokos szög érintetlen marad. Az időzítés és a szög különválasztása megkönnyíti a tempó módosítását a teljes animáció újjáépítése nélkül.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, RotationEffect, SaveFormat

presentation = Presentation("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("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 szolgál.

Egyéb ismétlési politikák: getRepeatDuration, getRepeatUntilEndSlide és getRepeatUntilNextClick; válasszon egy politikát, ahelyett, hogy mindet egyszerre engedélyezné. A getAutoReverse a forward lépés után visszafelé játssza le az animációt. 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 a mozgás létrehozásához. A getFrom, a getTo és a getBy százalékos koordinátákat vagy eltolásokat ír le. Szerkeszthető útvonalhoz hozza létre a MotionPath objektumot, és rendelje hozzá a MotionEffect.setPath metódussal. A MotionPath tárolja az útvonalkommandókat.

MotionCommandPathType választja ki a műveletet:

Parancs Pontok Jelentés
MoveTo Egy Beállítja a kezdőpozíciót.
LineTo Egy Egyenes szakaszon mozog a végpontig.
CurveTo Három Követ egy köbös görbét, amelyet két irányító pont és egy végpont definiál.
CloseLoop Nincs Visszatér a kiinduló pozícióba.
End Nincs Befejezi az útvonalat.

MotionPathPointsType leírja a pont‑szerkesztési jellemzőket, például sarok‑ vagy sima pontokat. Nem helyettesíti a parancstípust. A görbe példához használjon curve‑point típust, a egyenes szakaszokhoz corner‑point típust.

Az útvonal koordinátáit a dia méreteihez viszonyítva normalizálják: a 0.25 X‑eltolás a dia szélességének egynegyedét jelenti, nem 0.25 pontot. A pozitív Y lefelé halad. Az abszolút parancsok a koordináta‑rendszerben adják meg a pozíciót, a relatív parancsok a jelenlegi pozícióhoz képest adják meg az eltolást. Ez különbözik a getOrigin által kiválasztott referenciaképrendszertől, valamint a getPathEditMode által szabályozott útvonal‑mozgatási módoktól.

Egyenes útvonal létrehozása

Hozzon létre egy mozgás‑viselkedést egy kezdőponttal, egy egyenes szegmessel és egy végparancssal. A MotionPath.add a parancstípust, a pontokat, a pont‑típust és a relatív‑koordináta‑jelzőt veszi fel.

A kezdőparancs (0, 0)-t állít be, a vonal (0.25, 0)-ra végződik, így az útvonal a dia szélességének egynegyedével vízszintesen eltolódik. A befejező parancsnak nincs koordinátapontja. Amint az útvonalat hozzárendeljük, a mozgás‑viselkedés hozzáadása az effektushoz ezt az útvonalat a téglalaphoz kötja.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BehaviorFactory, EffectSubtype, EffectTriggerType, EffectType, MotionCommandPathType, MotionOriginType, MotionPath, MotionPathPointsType, Presentation, SaveFormat, ShapeType

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

presentation = 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 = BehaviorFactory()
    motion = factory.createMotionEffect()
    motion.setOrigin(MotionOriginType.Layout)
    motion.getTiming().setDuration(2)

    path = MotionPath()
    path_points = jpype.JArray(Point2DFloat)([Point2DFloat(0, 0)])
    path.add(MotionCommandPathType.MoveTo, path_points, MotionPathPointsType.Auto, False)
    path_points_2 = jpype.JArray(Point2DFloat)([Point2DFloat(0.25, 0)])
    path.add(MotionCommandPathType.LineTo, path_points_2, MotionPathPointsType.Corner, False)
    path_points_3 = jpype.JArray(Point2DFloat)(0)
    path.add(MotionCommandPathType.End, path_points_3, 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 három útvonalkommandóval tartalmaz. A következő fájlszerkesztési példák ezt a struktúrát használják.

Abszolút és relatív koordináták összehasonlítása

Ez a két útvonal‑objektum ugyanazt az útvonalat írja le. Az abszolút parancs (0.3, 0.1)-re ér véget; a relatív parancs (0.1, 0.1)-et ad a jelenlegi pozícióhoz, így (0.2, 0) lesz a végpont.

Mindkét útvonal ugyanazzal a kezdőpozícióval indul. Relatív vonal esetén adja hozzá az X és Y eltolást a jelenlegi pozícióhoz a végpont meghatározásához; abszolút vonal esetén a végpont közvetlenül olvasható. A jelző megváltoztatása a koordináták átalakítása nélkül más útvonalat eredményezne.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import MotionCommandPathType, MotionPath, MotionPathPointsType

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

absolute_path = MotionPath()
path_points = jpype.JArray(Point2DFloat)([Point2DFloat(0.2, 0)])
absolute_path.add(MotionCommandPathType.MoveTo, path_points, MotionPathPointsType.Auto, False)
path_points_2 = jpype.JArray(Point2DFloat)([Point2DFloat(0.3, 0.1)])
absolute_path.add(MotionCommandPathType.LineTo, path_points_2, MotionPathPointsType.Corner, False)

relative_path = MotionPath()
path_points_3 = jpype.JArray(Point2DFloat)([Point2DFloat(0.2, 0)])
relative_path.add(MotionCommandPathType.MoveTo, path_points_3, MotionPathPointsType.Auto, False)
path_points_4 = jpype.JArray(Point2DFloat)([Point2DFloat(0.1, 0.1)])
relative_path.add(MotionCommandPathType.LineTo, path_points_4, MotionPathPointsType.Corner, True)

Az egyik útvonalat hozzárendelheti egy mozgás‑viselkedéshez a prezentációban való használathoz. Az utolsó logikai argumentum a relatív koordinátákat állítja be az adott parancshoz.

Vonal helyettesítése görbével

Nyissa meg a motion.pptx‑t, és cserélje le a vonal‑parancsot egy köbös görbére. Először adja meg a két irányító pontot, majd a végpontot.

A kezdőpozíciót az előző parancs biztosítja. Az első két pont a görbét formálja, a harmadik a célpont; nem három egymást követő célpontokró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 új geometriája konzisztens legyen.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import MotionCommandPathType, MotionPathPointsType, Presentation, SaveFormat

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

presentation = Presentation("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)
    path_points = jpype.JArray(Point2DFloat)([Point2DFloat(0.1, 0), Point2DFloat(0.2, 0.1), Point2DFloat(0.3, 0.1)])
    path.get_Item(1).setPoints(path_points)

    presentation.save("curve.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

A curve.pptx útvonalában továbbra is három parancs van; középső parancs most egy görbét definiál.

Mentett útvonal megtekintése és szerkesztése

Minden MotionCmdPath a getPoints, a getCommandType, a getPointsType és az isRelative metódusokat teszi elérhetővé. Az alábbi példák a motion.pptx‑ben ismert három‑parancsos útvonalat használják. Tetszőleges bemenet esetén előbb keresse meg a kívánt hatást, és ellenőrizze a parancstípusokat és a pontszámokat, mielőtt index szerint szerkesztené.

Parancsok és koordináták olvasása

Olvassa be az útvonalat anélkül, hogy módosítaná. A vég‑ és a close‑loop parancsoknak nincs szükségük pontokra, ezért engedje meg a null‑ponttömböt.

A kimenet minden numerikus parancstípust a relatív‑koordináta‑jelzővel együtt jelenít meg, mielőtt a pontokat felsorolná. Ez lehetővé teszi, hogy a módosítás előtti lépésben megkülönböztesse a végpontot az eltolástól. Egy görbe három pontot listáz, míg ebben a fájlban a egyenes vonal csak egy pontot tartalmaz.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("motion.pptx")
try:
    effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0)
    motion = effect.getBehaviors().get_Item(0)

    path = motion.getPath()
    for segment in path:
        print(f"{segment.getCommandType()}, relative: {segment.isRelative()}")
        if segment.getPoints() is not None:
            for point in segment.getPoints():
                print(f"X={point.x}, Y={point.y}")
finally:
    presentation.dispose()

A felsorolás egy kezdőpontot, egy abszolút vonalat (0.25, 0) végponttal, és egy befejező parancsot tartalmaz.

Végpont módosítása

Nyissa meg a motion.pptx‑t, és cserélje le a vonal ponttömbjét, hogy elmozdítsa a végpontot.

A bemeneti fájlban az index 0 a kezdőparancs, az index 1 a vonal. A vonal egyetlen pontjának cseréje a célpontot módosítja anélkül, hogy a parancs típusát, időzítését vagy a gyűjteményben való pozícióját változtatná. 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 jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

presentation = Presentation("motion.pptx")
try:
    effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0)

    motion = effect.getBehaviors().get_Item(0)
    path_points = jpype.JArray(Point2DFloat)([Point2DFloat(0.4, 0.1)])
    motion.getPath().get_Item(1).setPoints(path_points)

    presentation.save("motion-endpoint.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

A motion-endpoint.pptx‑ben a vonal (0.4, 0.1)‑re végződik; az eredeti fájl változatlan maradt.

Szegmens helyettesítése

Használja a insert és a removeAt metódusokat a motion.pptx‑ben lévő vonal helyettesítéséhez. Beszúráskor a régi vonal a 2‑es indexre kerül.

Ez demonstrálja egy parancsobjektum helyettesítését a meglévő koordináták szerkesztése helyett. Beszúrás után a gyűjtemény ideiglenesen a kezdőparancsot, az új vonalat, a régi vonalat és a végparancsot tartalmazza. A 2‑es index eltávolítása eldobja a régi vonalat, és az új útvonal marad helyben.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import MotionCommandPathType, MotionPathPointsType, Presentation, SaveFormat

Point2DFloat = jpype.JClass("java.awt.geom.Point2D$Float")

presentation = Presentation("motion.pptx")
try:
    effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0)
    motion = effect.getBehaviors().get_Item(0)

    path = motion.getPath()
    path_points = jpype.JArray(Point2DFloat)([Point2DFloat(0.2, 0.1)])
    path.insert(1, MotionCommandPathType.LineTo, path_points, MotionPathPointsType.Corner, False)
    path.removeAt(2)

    presentation.save("motion-edited.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

A mentett útvonal továbbra is három parancsot tartalmaz, az új vonal (0.2, 0.1)‑re végződik, a befejező parancs pedig marad az utolsó.

Meglévő viselkedés módosítása és ellenőrzése

Ha a viselkedés indexe ismeretlen, válassza ki típusa szerint. Ez a példa megnyitja a rotation.pptx‑t, megtalálja a RotationEffect‑et, megváltoztatja a szöget, és a újranyitás után ellenőrzi a mentett értéket.

A típusellenőrzés lehetővé teszi, hogy a ciklus átlépje azokat a viselkedéseket, amelyek nem forgatások. A második betöltés a mentett fájlt egy külön prezentációobjektumba olvassa be, ezért az összehasonlítás a tartós adatot ellenőrzi, nem a memóriában még lévő értéket. Ez a példa továbbra is feltételezi, hogy a ismert hatás az első a fő sorozatban; típus alapján való kiválasztás nem helyezi el a megfelelő hatást egy tetszőleges prezentációban.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, RotationEffect, SaveFormat

presentation = Presentation("rotation.pptx")
try:
    effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0)

    for behavior in effect.getBehaviors():
        if isinstance(behavior, RotationEffect):
            rotation = behavior
            rotation.setBy(180)

    presentation.save("rotation-edited.pptx", SaveFormat.Pptx)

    reopened = Presentation("rotation-edited.pptx")
    try:
        saved_effect = reopened.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0)

        for behavior in saved_effect.getBehaviors():
            if isinstance(behavior, RotationEffect):
                rotation = behavior
                print(f"Rotation preserved: {abs(rotation.getBy() - 180) < 0.001}")
    finally:
        reopened.dispose()
finally:
    presentation.dispose()

A kimenet Rotation preserved: True. Alkalmazza ugyanazt a típusellenőrzési mintát más viselkedésekre is. Teljes megőrzés ellenőrzéséhez hasonlítsa össze a célalakzatot, a hatást, a viselkedéstípusokat és sorrendet, az időzítést, valamint az útvonal‑parancsokat. Lebegőpontos értékek esetén használjon numerikus toleranciát. Ismeretlen animációs elrendezésű prezentáció esetén tekintse meg a Read Shape Animations szakaszt a fő és interaktív sorozatok bejárásához.

Viselkedés sorrend, előbeállítások és lejátszás

A BehaviorCollection sorrendje egy hatás műveleteinek tárolt sorrendje. Nem egy lejátszási lista, ahol minden viselkedés automatikusan vár az előzőre. Az időzítés és a befoglaló hatás határozza meg a ütemezést. A viselkedések átlapolhatnak, és ugyanazon tulajdonságra vonatkozó műveletek kölcsönhatásba léphetnek a getAdditive és a getAccumulate által. Ne használja a gyűjtemény újrarendezését önmagában a „mozgatás, majd forgatás” ütemezéséhez; használjon kifejezett időzítést vagy külön hatásokat, ahogy azt a Shape Animation leírja.

A hatás getType és getSubtype leírja az előbeállítást, de nem ad teljes képet egy szerkesztett viselkedésfáról. Válassza ki az előbeállítást és alcsaládot, mielőtt testre szabná a viselkedéseket: az előbeállítás módosítása újraépítheti a gyűjteményt és elvetheti az egyéni műveleteket. Például egy testre szabott Spin hatás Fade‑re cserélése helyettesítheti a forgatási viselkedést set‑ és filter‑viselkedésekkel. Módosítás után ellenőrizze újra a gyűjteményt. Az előbeállítás viselkedéseinek törlése eltávolíthatja a láthatóságot vagy inicializálást biztosító műveleteket is, amelyeket a preset igényel. A példák szándékosan látható alakzatokat használnak, és a viselkedéseket felülírják; nem rekonstruálják minden preset teljes megvalósítását.

Formátum kompatibilitás

Egy megőrzött viselkedésfa nem garantálja az azonos lejátszást minden nézőben vagy export‑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 Az ebben a példában elsődleges formátumként használatos. Nyissa újra a fájlt, hogy ellenőrizze a szerkeszthető viselkedésfát, majd ellenőrizze a lejátszást a célzott PowerPoint‑verzióban.
PPT Az örökölt bináris ábrázolás eltérhet a PPTX‑től. Végezzen külön mentés‑újranyitás‑ciklust és lejátszási tesztet; ne vonjon le támogatási következtetéseket minden egyéni kombinációról a sikeres PPTX‑kimenet alapján.
PDF, PNG, JPEG és egyéb statikus dia‑képek Statikus diaképet tartalmaznak, nem játszható viselkedés‑idővonalat vagy garantált véganimációs képkockát.
HTML5 Támogatott animációkat tud lejátszani, ha az export‑opciókban engedélyezve van a shape animation. Tesztelje az egyéni kombinációkat böngészőben.
Animated GIF Renderelt képkockákat tárol, nem szerkeszthető viselkedést 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óvá kódolja. A támogatás a renderelő támogatott animációi és hatásai szerint korlátozott; a parancsok és interaktív események nem válnak szerkeszthető idővonalá.

GYIK

Miért tartalmaz a hatásom viselkedéseket már a hozzáadás előtt?

Egy előre definiált hatás létrehozhatja a mögöttes műveleteket. Ellenőrizze őket, mielőtt úgy dönt, hogy a presetet bővíti vagy a viselkedéseket felülírja.

A viselkedés elejére helyezése garantálja, hogy először fusson?

Nem feltétlenül. A gyűjtemény sorrendje nem helyettesíti az időzítést. Ellenőrizze a késleltetéseket, időtartamokat és a műveletek közti kölcsönhatásokat ugyanazon tulajdonságon.

Miért nem rendelkezik a befejező parancs pontokkal?

Ez a parancs a path végét jelöli, és nem igényel koordinátákat. A fájlból beolvasott path ellenőrzésekor vizsgálja, hogy van‑e null‑ponttömb.

Elég egy sikeres round‑trip a lejátszás megerősítéséhez?

Nem. Az újranyitás csak a ellenőrzött tulajdonságok megmaradását igazolja. A diavetítő lejátszót vagy az animált exportot külön kell tesztelni a vizuális viselkedés megerősítéséhez.