Créer et modifier des comportements d'animation personnalisés en Java
Aperçu
Les comportements d’animation personnalisés vous permettent de contrôler des opérations individuelles au sein d’un effet d’animation, comme changer une couleur, faire pivoter une forme ou suivre un chemin de mouvement modifiable. Ce guide montre comment créer et combiner des comportements, configurer leur synchronisation, inspecter et modifier des animations existantes, et vérifier que leurs propriétés persistent après la sauvegarde et la réouverture d’une présentation.
Pour les effets prédéfinis et les déclencheurs de clic, voir Animation de forme.
Comprendre le modèle d’animation
Une animation est organisée comme Chronologie → Séquence → Effet → Comportements :
- La méthode getTimeline renvoie la chronologie de la diapositive, qui contient sa séquence principale et les séquences interactives.
- Un ISequence contient des effets, pouvant cibler différentes formes.
- Un IEffect identifie une forme cible, un préréglage, un sous‑type et la synchronisation de l’effet.
- La collection renvoyée par IEffect.getBehaviors contient les opérations qui implémentent l’effet : changer la couleur, déplacer, faire pivoter, définir une propriété, etc.
Créer des comportements individuels
Appelez ISequence.addEffect pour créer un effet et accéder à la collection getBehaviors. Un préréglage peut peupler automatiquement cette collection. Conservez ses opérations lors de l’extension du préréglage, ou utilisez clear lorsque vous les remplacez intentionnellement.
IBehaviorFactory crée les huit types de comportements illustrés ci‑dessous. Le mouvement est abordé dans Créer un chemin de mouvement. Chaque extrait inclut ses imports ; placez ses instructions exécutables à l’intérieur d’une méthode. Les exemples d’édition ultérieure indiquent le fichier de sortie utilisé.
Rotation
Utilisez createRotationEffect pour créer une rotation. getBy spécifie un angle relatif en degrés ; getFrom et getTo définissent les points de départ et d’arrivée.
L’exemple commence avec un effet Spin, remplace ses opérations de préréglage par un seul comportement de rotation et attribue à cette opération une durée de deux secondes. Un angle relatif de 90° représente un quart de tour à partir de l’orientation initiale de la forme, aucune angle de départ explicite n’est donc nécessaire.
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 contient une forme et un comportement de rotation. La collection, la synchronisation et les exemples d’édition de rotation ci‑dessous utilisent ce fichier.
Échelle
Utilisez createScaleEffect avec des pourcentages X/Y : getFrom et getTo décrivent la taille de départ et d’arrivée, tandis que getBy décrit un changement relatif. Ici, 100 représente la taille originale.
L’exemple augmente les deux dimensions de 100 % à 125 % pendant deux secondes. Utiliser les mêmes pourcentages horizontaux et verticaux conserve les proportions de la forme ; des pourcentages différents étireraient une dimension davantage que l’autre.
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();
}
Couleur
Utilisez createColorEffect pour changer le remplissage du bleu à l’orange. getFrom et getTo sont des couleurs ; getBy est un décalage de couleur. IBehavior.getProperties identifie l’attribut animé.
Le remplissage solide de la forme est initialisé en bleu, correspondant à la couleur de départ de l’animation. Sélectionner l’attribut remplissage‑couleur indique au comportement quelle partie de la forme modifier ; les points de couleur seuls n’identifient pas cet attribut. L’effet enregistré décrit une transition de deux secondes vers l’orange.
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();
}
Filtre
Utilisez createFilterEffect pour sélectionner un balayage. getType, getSubtype, et getReveal spécifient le filtre, la direction et s’il faut révéler ou masquer la forme.
Cet exemple configure un balayage de deux secondes qui révèle la forme en utilisant le sous‑type de direction droite. Les paramètres du filtre appartiennent au comportement à l’intérieur de l’effet, ils sont donc configurés après la suppression des opérations originales du préréglage.
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();
}
Propriété
Utilisez createPropertyEffect pour animer l’opacité. getFrom, getTo, et getBy sont des chaînes interprétées grâce à getValueType et getCalcMode. Choisissez des points d’arrivée ou un décalage relatif plutôt que de définir les trois simultanément.
Ici, l’attribut sélectionné est l’opacité, et les chaînes numériques représentent un passage de 25 % d’opacité à une opacité totale. L’interpolation linéaire décrit une variation graduelle entre ces valeurs. Lors de l’adaptation de cet exemple à une autre propriété, choisissez un type de valeur et des valeurs d’extrémité appropriés à cette propriété.
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();
}
Définir
Utilisez createSetEffect pour assigner la visibilité via getTo. Un comportement de type set n’interpole pas entre les points d’arrivée.
L’exemple sélectionne l’attribut visibilité et affecte la chaîne visible lorsque le comportement s’exécute. Le rectangle est déjà visible dans cette présentation minimale, si bien que l’affectation peut ne pas produire de changement visuel évident à elle seule. Une telle opération est utile dans le cadre d’un effet plus large qui contrôle également quand la forme devient cachée ou visible.
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();
}
Commande
Utilisez createCommandEffect et configurez getType, getCommandString, et getShapeTarget. Placez un enregistrement WAV nommé sample.wav dans le répertoire de travail. Cet exemple l’intègre avec addAudioFrameEmbedded et attache une commande de lecture à la trame audio.
La trame audio est à la fois la cible de l’effet et la cible de la commande. Cela relie la demande de lecture à l’enregistrement intégré ; une chaîne de commande seule n’identifie pas l’objet multimédia à contrôler. L’effet est configuré pour démarrer sur un clic pendant le diaporama.
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();
}
La sauvegarde stocke la commande dans command.pptx ; elle ne lit pas l’enregistrement. La lecture nécessite un lecteur de diaporama qui prend en charge la commande et sa cible multimédia.
Gérer la collection de comportements
IBehaviorCollection prend en charge add, insert, remove, et removeAt. Cet exemple ouvre rotation.pptx, ajoute une mise à l’échelle, la déplace avant la rotation et supprime la rotation. Supprimer et réinsérer le même objet modifie sa position stockée sans en créer une copie.
La séquence d’éditions change la collection de rotation‑scale à scale‑rotation, puis à scale uniquement. Les indices se réfèrent à la collection courante, de sorte que la suppression utilise le nouvel indice de la rotation après le réordonnancement. L’énumération finale confirme quel comportement sera sauvegardé.
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();
}
Le résultat est ScaleEffect : seule la mise à l’échelle reste. L’ordre de la collection ne planifie pas, à lui seul, les comportements les uns après les autres. Videz la collection uniquement lorsque vous remplacez toutes ses opérations.
Configurer la synchronisation des comportements
IBehavior.getTiming expose ITiming, indépendamment de IEffect.getTiming. La synchronisation de l’effet planifie l’effet englobant ; la synchronisation du comportement décrit une opération à l’intérieur de celui‑ci.
Définir la durée, le retard, la répétition et l’accélération
Ouvrez rotation.pptx et définissez la durée (getDuration) et le délai de déclenchement (getTriggerDelayTime) en secondes, puis configurez le nombre de répétitions via setRepeatCount. getAccelerate et getDecelerate sont des fractions de la durée ; gardez leur somme au plus égale à 1.
Le fichier d’entrée est celui créé dans l’exemple de rotation, où le premier comportement est connu pour être une rotation. Cet exemple ne modifie que la synchronisation de ce comportement ; son angle de 90° reste intact. Séparer l’angle et la synchronisation facilite l’ajustement du rythme sans reconstruire l’animation.
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();
}
Le comportement utilise une durée de deux secondes, un retard de demi‑seconde et un compte de répétition de 3. Les 20 % initiaux et finaux de sa durée sont utilisés pour l’accélération et la décélération.
D’autres politiques de répétition comprennent getRepeatDuration, getRepeatUntilEndSlide, et getRepeatUntilNextClick; choisissez une politique plutôt que de les activer toutes simultanément. getAutoReverse lit l’animation à l’envers après le passage en avant. L’accélération et la décélération s’appliquent aux changements continus, pas aux affectations discrètes ou aux commandes.
Créer un chemin de mouvement
Utilisez createMotionEffect pour créer un mouvement. Ses getFrom, getTo, et getBy décrivent des coordonnées ou des décalages exprimés en pourcentage. Pour une trajectoire modifiable, créez un MotionPath et assignez‑le avec IMotionEffect.setPath. IMotionPath stocke les commandes du chemin.
MotionCommandPathType sélectionne l’opération :
| Commande | Points | Signification |
|---|---|---|
| MoveTo | Un | Définit la position de départ. |
| LineTo | Un | Déplace le long d’un segment droit jusqu’à son point final. |
| CurveTo | Trois | Suit une courbe cubique définie par deux points de contrôle et un point final. |
| CloseLoop | Aucun | Retourne à la position de départ. |
| End | Aucun | Termine le chemin. |
MotionPathPointsType décrit les caractéristiques de modification des points, telles que coin ou point lisse. Il ne remplace pas le type de commande. Utilisez un type de point de courbe pour l’exemple de courbe ci‑dessous, et un type de point coin pour les segments droits.
Les coordonnées du chemin sont normalisées aux dimensions de la diapositive : un déplacement X de 0,25 représente un quart de la largeur de la diapositive, pas 0,25 point. Y positif descend. Les commandes absolues spécifient des positions dans le système de coordonnées du chemin ; les commandes relatives spécifient des décalages par rapport à la position courante. Cela est distinct de getOrigin, qui sélectionne le cadre de référence du chemin, et de getPathEditMode, qui contrôle comment le chemin se déplace lorsqu’on déplace la forme.
Créer un chemin droit
Créez un comportement de mouvement avec un point de départ, un segment droit et une commande de fin. IMotionPath.add prend le type de commande, ses points, le type de point et un indicateur de coordonnées relatives.
La commande de départ établit (0, 0), et la ligne se termine à (0,25, 0), donnant au trajet un déplacement horizontal d’un quart de la largeur de la diapositive. La commande de fin n’a aucun point de coordonnées. Une fois le chemin assigné, ajouter le comportement de mouvement à l’effet relie ce trajet au rectangle.
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 contient un comportement de mouvement avec trois commandes de chemin. Les exemples d’édition de fichier suivants utilisent cette structure connue.
Comparer les coordonnées absolues et relatives
Ces deux objets chemin décrivent le même trajet. La commande absolue se termine à (0,3, 0,1) ; la commande relative ajoute (0,1, 0,1) à la position courante, soit (0,2, 0).
Les deux chemins partent de la même position. Pour la ligne relative, ajoutez ses décalages X et Y à la position courante afin d’obtenir le point final ; pour la ligne absolue, lisez directement le point final. Changer l’indicateur sans convertir les coordonnées décrirait un trajet différent.
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);
Assignez l’un ou l’autre chemin à un comportement de mouvement pour l’utiliser dans une présentation. Le dernier argument booléen sélectionne les coordonnées relatives pour cette commande.
Remplacer une ligne par une courbe
Ouvrez motion.pptx et remplacez sa commande de ligne par une courbe cubique. Fournissez d’abord les deux points de contrôle, suivis du point final.
La position de départ est fournie par la commande précédente. Les deux premiers points façonnent la courbe, tandis que le troisième est sa destination ; ils ne sont pas trois destinations successives. Mettre à jour simultanément le type de commande, le type de points et le tableau de points maintient le segment cohérent avec sa nouvelle géométrie.
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();
}
Le chemin dans curve.pptx possède toujours trois commandes ; sa commande du milieu définit maintenant une courbe.
Inspecter et modifier un chemin enregistré
Chaque IMotionCmdPath expose getPoints, getCommandType, getPointsType, et isRelative. Les exemples suivants utilisent le chemin à trois commandes connu dans motion.pptx. Pour une entrée arbitraire, localisez l’effet visé et vérifiez les types de commandes et le nombre de points avant de modifier par indice.
Lire les commandes et les coordonnées
Lisez le chemin sans le modifier. Les commandes End et CloseLoop n’ont pas besoin de points, prévoyez donc un tableau de points nul.
La sortie associe chaque type de commande numérique à son indicateur de coordonnées relatives avant de lister ses points. Cela vous permet de distinguer un point final d’un décalage avant de modifier le chemin. Une courbe listerait trois points, alors que la ligne droite de ce fichier n’en liste qu’un.
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();
}
Le listing contient un point de départ, une ligne absolue se terminant à (0,25, 0), et une commande End.
Modifier un point final
Ouvrez motion.pptx et remplacez le tableau de points de la ligne afin de déplacer son point final.
Dans le fichier d’entrée, l’indice 0 désigne la commande de départ et l’indice 1 la ligne. Remplacer le point unique de la ligne change sa destination sans modifier son type de commande, sa synchronisation ou sa position dans la collection. Parce que la commande utilise des coordonnées absolues, la nouvelle paire spécifie une position plutôt qu’un décalage ajouté.
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();
}
La ligne dans motion-endpoint.pptx se termine à (0,4, 0,1) ; le fichier original reste inchangé.
Remplacer un segment
Utilisez insert et removeAt pour remplacer la ligne dans motion.pptx. L’insertion décale l’ancienne ligne à l’indice 2.
Cela montre le remplacement d’un objet commande plutôt que la modification de ses coordonnées existantes. Après insertion, la collection contient temporairement la commande de départ, la nouvelle ligne, l’ancienne ligne et la commande End. Supprimer l’indice 2 élimine l’ancienne ligne et laisse le nouveau trajet en place.
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();
}
Le chemin enregistré conserve toujours trois commandes, la nouvelle ligne se terminant à (0,2, 0,1) et la commande End à la fin.
Modifier et vérifier un comportement existant
Lorsque l’indice du comportement est inconnu, sélectionnez‑le par type. Cet exemple ouvre rotation.pptx, trouve son IRotationEffect, modifie l’angle et vérifie la valeur enregistrée après réouverture.
La vérification du type permet à la boucle de sauter les comportements qui ne sont pas des rotations. Le second chargement lit le fichier sauvegardé dans un objet présentation distinct, de sorte que la comparaison porte sur les données persistées plutôt que sur la valeur encore en mémoire. Cet exemple suppose toujours que l’effet connu est le premier de la séquence principale ; sélectionner un comportement par type ne localise pas forcément le bon effet dans une présentation arbitraire.
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();
}
La sortie est Rotation preserved: true. Appliquez le même modèle de vérification de type à d’autres comportements. Pour un contrôle complet de préservation, comparez la forme cible, l’effet, les types et l’ordre des comportements, la synchronisation et les commandes de chemin. Utilisez une tolérance numérique pour les valeurs en virgule flottante. Pour une présentation avec une disposition d’animation inconnue, voir Read Shape Animations pour le parcours des séquences principales et interactives.
Ordre des comportements, préréglages et lecture
L’ordre dans IBehaviorCollection correspond à l’ordre stocké des opérations d’un effet. Ce n’est pas une liste de lecture où chaque comportement attend automatiquement le précédent. La synchronisation et l’effet englobant déterminent la planification. Les comportements peuvent se chevaucher, et les opérations sur la même propriété peuvent interagir via getAdditive et getAccumulate. Ne vous fiez pas uniquement au réordonnancement de la collection pour planifier « déplacer, puis tourner » ; utilisez la synchronisation explicite ou des effets séparés comme décrit dans Animation de forme.
Le getType et le getSubtype de l’effet décrivent son préréglage. Ils ne constituent pas une description complète d’un arbre de comportements édité. Choisissez le préréglage et le sous‑type avant de personnaliser les comportements : changer le préréglage peut reconstruire la collection et supprimer vos opérations personnalisées. Par exemple, transformer un effet Spin personnalisé en Fade peut remplacer son comportement de rotation par des comportements set et filter. Inspectez à nouveau la collection après modification d’un préréglage ou d’un sous‑type. Vider les comportements de préréglage peut également supprimer des opérations de visibilité ou d’initialisation dont le préréglage a besoin. Les exemples utilisent volontairement des formes visibles et remplacent les comportements ; ils ne reconstruisent pas chaque implémentation de préréglage.
Compatibilité des formats
Un arbre de comportements préservé ne garantit pas une lecture identique dans chaque visionneur ou moteur d’exportation. Vérifiez séparément les données sauvegardées et le rendu final.
| Format ou sortie | Ce qu’il faut vérifier |
|---|---|
| PPTX | Utilisez ce format comme principal pour ces exemples. Rouvrez‑le pour vérifier l’arbre de comportements éditable, puis testez la lecture dans la version PowerPoint visée. |
| PPT | La représentation binaire héritée peut différer du PPTX. Testez un cycle sauvegarde‑reouverture séparé et la lecture ; ne déduisez pas la prise en charge de chaque combinaison personnalisée à partir d’un succès PPTX. |
| PDF, PNG, JPEG et autres images de diapositives statiques | Contiennent une représentation statique de la diapositive, pas de ligne de temps jouable ni d’image finale d’animation garantie. |
| HTML5 | Peut lire les animations prises en charge lorsque l’animation de forme est activée dans les options d’export. Testez les combinaisons personnalisées dans le navigateur. |
| Animated GIF | Stocke les images rendues, pas les comportements éditables ni les interactions déclenchées par clic. Vérifiez le mouvement réellement rendu. |
| Video | Render les cadres d’animation et les encode en vidéo. Le support est limité aux animations et effets pris en charge ; les commandes et événements interactifs ne deviennent pas une ligne de temps éditable. |
FAQ
Pourquoi mon effet contient‑il des comportements avant que j’en ajoute ?
Créer un effet prédéfini peut créer ses opérations sous‑jacentes. Inspectez‑les avant de décider d’étendre le préréglage ou de remplacer ses comportements.
Le fait de déplacer un comportement vers le début le fait‑il jouer en premier ?
Pas nécessairement. L’ordre de la collection ne remplace pas la synchronisation. Vérifiez les délais, les durées et les interactions entre les opérations sur la même propriété.
Pourquoi une commande End n’a‑t‑elle aucun point ?
Elle marque la fin du chemin et n’a pas besoin de coordonnées. Vérifiez un tableau de points nul lors de l’inspection d’un chemin lu depuis un fichier.
Un aller‑retour réussi suffit‑il à confirmer la lecture ?
Non. La réouverture confirme la conservation des propriétés que vous avez vérifiées. Testez séparément le lecteur de diaporama ou l’export animé pour confirmer son comportement visuel.