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

Přehled

Vlastní animační chování vám umožňují řídit jednotlivé operace v rámci animačního efektu, například změnu barvy, otáčení tvaru nebo sledování editovatelné dráhy pohybu. Tento průvodce ukazuje, jak vytvářet a kombinovat chování, konfigurovat jejich časování, prohlížet a upravovat existující animace a ověřit, že jejich vlastnosti přežijí uložení a opětovné otevření prezentace.

Pro předdefinované efekty a spouštěče kliknutím viz Shape Animation.

Pochopení animačního modelu

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

  • Metoda getTimeline vrací časovou osu snímku, která obsahuje hlavní sekvenci i interaktivní sekvence.
  • ISequence obsahuje efekty, které mohou cílit na různé tvary.
  • IEffect identifikuje cílový tvar, předvolbu, podtyp a časování efektu.
  • Kolekce vrácená metodou IEffect.getBehaviors obsahuje operace, které implementují efekt: změna barvy, přesun, otáčení, nastavení vlastnosti a podobně.

Vytvoření jednotlivých chování

Voláním ISequence.addEffect vytvoříte efekt a získáte přístup ke kolekci getBehaviors. Předvolba může tuto kolekci naplnit automaticky. Uchovejte její operace při rozšiřování předvolby, nebo použijte clear když je záměrně nahrazujete.

IBehaviorFactory vytváří osm typů chování ilustrovaných níže. Pohyb je popsán v sekci Build a Motion Path. Každý úryvek obsahuje své importy; vkládejte spustitelné příkazy do metody. Příklady úprav později uvádějí, který výstupní soubor používají.

Rotace

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

Příklad začíná efektem Spin, nahradí jeho předvolené operace jedním chováním rotace a nastaví tomuto chování dvousekundovou dobu trvání. Relativní úhel 90 stupňů představuje čtvrtotoč, takže není třeba explicitně zadávat počáteční úhel.

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

Měřítko

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

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

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

Barva

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

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

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

Filtr

Použijte createFilterEffect k výběru setření. getType, getSubtype, a getReveal určují typ filtru, směr a zda má tvar odhalit nebo skrýt.

Tento příklad konfiguruje dvousekundové setření, které odhalí tvar pomocí podtypu pravý směr. Nastavení filtru patří k chování uvnitř efektu, takže jsou konfigurována po odstranění původních operací předvolby.

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

Vlastnost

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

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

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

Nastavení

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

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

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

Příkaz

Použijte createCommandEffect a nakonfigurujte getType, getCommandString, a getShapeTarget. Umístěte WAV nahrávku pojmenovanou sample.wav do pracovního adresáře. Tento příklad ji vloží pomocí addAudioFrameEmbedded a připojí příkaz přehrát k audio rámci.

Audio rámec je jak cílem efektu, tak cílem příkazu. Toto propojuje požadavek na přehrání s vloženou nahrávkou; samotný řetězec příkazu neidentifikuje, který mediální objekt má být ovládán. Efekt je nastaven tak, aby se spustil kliknutím během prezentace.

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

Uložení uloží příkaz do command.pptx; nahrávka se neprohraje. Přehrání vyžaduje přehrávač prezentací, který podporuje příkaz a jeho mediální cíl.

Správa kolekce chování

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

Pořadí úprav mění kolekci z rotace‑měřítka na měřítko‑rotaci a nakonec jen na měřítko. Indexy odkazují na aktuální kolekci, takže odstranění používá nový index rotace po přeuspořádání. Závěrečné výčty potvrzují, které chování bude uloženo.

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

Výstup je ScaleEffect: zůstává jen měřítko. Pořadí v kolekci samo o sobě neplánuje chování za sebou. Vyprázdněte kolekci jen při nahrazování všech jejích operací.

Konfigurace časování chování

IBehavior.getTiming zveřejňuje ITiming, nezávisle na IEffect.getTiming. Časování efektu plánuje obalující efekt; časování chování popisuje operaci uvnitř něj.

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

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

Vstupní soubor je ten, který byl vytvořen v příkladu rotace, kde je první chování známé jako rotace. Tento příklad mění jen časování tohoto chování; úhel 90 stupňů zůstává nedotčen. Udržení úhlu a časování odděleně usnadňuje úpravu tempa, aniž byste museli znovu stavět animaci.

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

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

Jiné politiky opakování zahrnují getRepeatDuration, getRepeatUntilEndSlide, a getRepeatUntilNextClick; zvolte jednu politiku namísto povolení všech najednou. getAutoReverse přehraje animaci zpětně po dopředu. Zrychlení a zpomalení se vztahují na plynulé změny, ne na diskrétní přiřazení nebo příkazy.

Sestavení dráhy pohybu

Použijte createMotionEffect k vytvoření pohybu. Jeho getFrom, getTo, a getBy popisují souřadnice nebo offsety založené na procentech. Pro editovatelnou trasu vytvořte MotionPath a přiřaďte ji pomocí IMotionEffect.setPath. IMotionPath ukládá příkazy dráhy.

MotionCommandPathType vybírá operaci:

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

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

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

Vytvoření přímé dráhy

Vytvořte chování pohybu se startovacím bodem, jedním přímým segmentem a koncovým příkazem. IMotionPath.add přijímá typ příkazu, jeho body, typ bodu a příznak relativních souřadnic.

Startovací příkaz stanoví (0, 0) a čára končí v (0.25, 0), čímž dráze dodá vodorovný posun o čtvrtinu šířky snímku. Koncový příkaz nemá žádné souřadnicové body. Po přiřazení dráhy se přidáním chování pohybu k efektu propojí tato trasa s obdélníkem.

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

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

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

Obě dráhy začínají ve stejné pozici. Pro relativní čáru přidejte její X a Y offsety k aktuální pozici, abyste získali koncový bod; pro absolutní čáru přečtěte koncový bod přímo. Přepnutí příznaku bez konverze souřadnic by popisovalo jinou trasu.

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

Přiřaďte libovolnou dráhu k chování pohybu a použijte ji v prezentaci. Poslední Boolean argument určuje, zda jsou souřadnice pro daný příkaz relativní.

Nahrazení čáry křivkou

Otevřete motion.pptx a nahraďte jeho čárový příkaz kubickou křivkou. Nejprve zadejte dva řídicí body, pak koncový bod.

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

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

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

Prohlížení a úprava uložené dráhy

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

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

Přečtěte dráhu bez změny. Příkazy konce a uzavření smyčky nepotřebují body, takže připravte možnost nulového pole bodů.

Výstup spojuje každý číselný typ příkazu s jeho příznakem relativních souřadnic před vyjmenováním bodů. To vám umožní rozlišit koncový bod od offsetu před úpravou dráhy. Křivka by vypsala tři body, zatímco přímá čára v tomto souboru vypíše jen jeden.

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

Výpis obsahuje startovní bod, absolutní čáru končící v (0.25, 0) a příkaz konce.

Změna koncového bodu

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

Ve vstupním souboru je index 0 startovací příkaz a index 1 čára. Nahrazení jediného bodu čáry změní její cíl bez změny typu příkazu, časování nebo pozice v kolekci. Protože příkaz používá absolutní souřadnice, nový pár určuje pozici, nikoli přidaný offset.

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

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

Nahrazení segmentu

Použijte insert a removeAt k nahrazení čáry v motion.pptx. Vložení posune starou čáru na index 2.

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

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

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

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

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

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

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

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

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

Pořadí v IBehaviorCollection je uložené pořadí operací efektu. Nejedná se o playlist, ve kterém každé chování automaticky čeká na předchozí. Časování a obalující efekt určují plánování. Chování se může překrývat a operace na stejné vlastnosti mohou interagovat přes getAdditive a getAccumulate. Nepoužívejte jen přeuspořádání kolekce k naplánování „přesun, pak otáčení“; použijte explicitní časování nebo samostatné efekty, jak je popsáno v Shape Animation.

IEffect.getType a IEffect.getSubtype popisují jeho předvolbu. Nejsou úplným popisem upraveného stromu chování. Vyberte předvolbu a podtyp před vlastním přizpůsobením chování: změna předvolby může znovu vytvořit kolekci a zahodit vaše vlastní operace. Například změna přizpůsobeného efektu Spin na Fade může nahradit jeho rotaci chováním set a filter. Po změně předvolby nebo podtypu znovu zkontrolujte kolekci. Vyprázdnění předvolených chování může také odstranit viditelnost nebo inicializační operace, které předvolba potřebuje. Příklady záměrně používají viditelné tvary a nahrazují chování; nerekonstruují každou implementaci předvolby.

Kompatibilita formátů

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

Formát nebo výstup Co ověřit
PPTX Používejte jako primární formát pro tyto příklady. Otevřete jej znovu a ověřte editovatelný strom chování, pak zkontrolujte přehrání v požadované verzi PowerPointu.
PPT Starší binární reprezentace se může lišit od PPTX. Otestujte samostatný cyklus uložení‑otevření a přehrání; nevyvozujte podporu pro každou vlastní kombinaci jen z úspěšného výstupu PPTX.
PDF, PNG, JPEG a další statické snímky Obsahují statický obrázek snímku, ne přehratelnou časovou osu chování ani zaručený finální animační snímek.
HTML5 Může přehrávat podporované animace, pokud je v možnostech exportu povolena animace tvaru. Otestujte vlastní kombinace v prohlížeči.
Animated GIF Ukládá vykreslené snímky, ne editovatelné chování ani interakci spouštěnou kliknutím. Zkontrolujte skutečný vykreslený pohyb.
Video Vykreslí animační snímky a zakóduje je jako video. Podpora je omezena na supported animations and effects renderera; příkazy a interaktivní události se nepřevádějí na editovatelnou časovou osu.

Často kladené otázky

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

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

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

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

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

Označuje konec dráhy a nepotřebuje souřadnice. Při prohlížení dráhy načtené ze souboru kontrolujte, zda není pole bodů null.

Je úspěšná zpětná cesta dostačující k potvrzení přehrání?

Ne. Otevření potvrzuje zachování vlastností, které jste zkontrolovali. Otestujte přehrávač prezentací nebo animovaný export samostatně, abyste potvrdili jeho vizuální chování.