Buat dan Modifikasi Perilaku Animasi Kustom di .NET
Ikhtisar
Custom animation behaviors let you control individual operations within an animation effect, such as changing a color, rotating a shape, or following an editable motion path. This guide shows how to create and combine behaviors, configure their timing, inspect and modify existing animations, and verify that their properties survive saving and reopening a presentation.
Untuk efek yang sudah ditentukan dan pemicu klik, lihat Animasi Bentuk.
Memahami Model Animasi
An animation is organized as Timeline → Sequence → Effect → Behaviors:
- Slide’s Timeline contains its main sequence and interactive sequences.
- An ISequence contains effects, potentially targeting different shapes.
- An IEffect identifies a target shape, preset, subtype, and effect timing.
- IEffect.Behaviors contains the operations that implement the effect: changing color, moving, rotating, setting a property, and so on.
Membuat Perilaku Individual
Call ISequence.AddEffect to create an effect and access its Behaviors collection. A preset can populate this collection automatically. Keep its operations when extending the preset, or use Clear when deliberately replacing them.
IBehaviorFactory creates the eight behavior types illustrated below. Motion is covered in Build a Motion Path. Each creation example is a complete program; later editing examples state which output file they use.
Rotasi
Use CreateRotationEffect to create a rotation. By specifies a relative angle in degrees; From and To specify endpoints.
The example starts with a Spin effect, replaces its preset operations with one rotation behavior, and gives that operation a two-second duration. A relative angle of 90 degrees expresses a quarter-turn from the shape’s starting orientation, so no explicit starting angle is needed.
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Spin, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var rotation = factory.CreateRotationEffect();
rotation.By = 90f;
rotation.Timing.Duration = 2f;
effect.Behaviors.Add(rotation);
presentation.Save("rotation.pptx", SaveFormat.Pptx);
rotation.pptx contains one shape and one rotation behavior. The collection, timing, and rotation-editing examples below use this file.
Skala
Use CreateScaleEffect with X/Y percentages: From and To describe the starting and ending size, while By describes a relative change. Here, 100 means the original size.
The example grows both dimensions from 100% to 125% over two seconds. Using equal horizontal and vertical percentages keeps the shape’s proportions; different percentages would stretch one dimension more than the other.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.GrowShrink, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var scale = factory.CreateScaleEffect();
scale.From = new PointF(100, 100);
scale.To = new PointF(125, 125);
scale.Timing.Duration = 2f;
effect.Behaviors.Add(scale);
presentation.Save("scale.pptx", SaveFormat.Pptx);
Warna
Use CreateColorEffect to change the fill from blue to orange. From and To are colors; By is a color offset. IBehavior.Properties identifies the attribute being animated.
The shape’s solid fill is initialized to blue, matching the animation’s starting color. Selecting the fill-color attribute tells the behavior which part of the shape to change; the color endpoints alone do not identify that attribute. The saved effect describes a two-second transition to orange.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
shape.FillFormat.FillType = FillType.Solid;
shape.FillFormat.SolidFillColor.Color = Color.Blue;
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.ChangeFillColor, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var color = factory.CreateColorEffect();
color.Properties.Add(BehaviorProperty.FillColor);
color.From.Color = Color.Blue;
color.To.Color = Color.Orange;
color.Timing.Duration = 2f;
effect.Behaviors.Add(color);
presentation.Save("color.pptx", SaveFormat.Pptx);
Filter
Use CreateFilterEffect to select a wipe. Type, Subtype, and Reveal specify the filter, direction, and whether to reveal or hide the shape.
This example configures a two-second wipe that reveals the shape using the right-direction subtype. The filter settings belong to the behavior inside the effect, so they are configured after the preset’s original operations have been removed.
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Wipe, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var filter = factory.CreateFilterEffect();
filter.Type = FilterEffectType.Wipe;
filter.Subtype = FilterEffectSubtype.Right;
filter.Reveal = FilterEffectRevealType.In;
filter.Timing.Duration = 2f;
effect.Behaviors.Add(filter);
presentation.Save("filter.pptx", SaveFormat.Pptx);
Properti
Use CreatePropertyEffect to animate opacity. From, To, and By are strings interpreted using ValueType and CalcMode. Choose endpoints or a relative offset rather than setting all three indiscriminately.
Here, the selected attribute is opacity, and the numeric strings represent a change from 25% opacity to full opacity. Linear interpolation describes a gradual change between those values. When adapting this example to another attribute, choose a value type and endpoint values appropriate to that attribute.
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Fade, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var property = factory.CreatePropertyEffect();
property.Properties.Add(BehaviorProperty.StyleOpacity);
property.ValueType = PropertyValueType.Number;
property.CalcMode = PropertyCalcModeType.Linear;
property.From = "0.25";
property.To = "1";
property.Timing.Duration = 2f;
effect.Behaviors.Add(property);
presentation.Save("property.pptx", SaveFormat.Pptx);
Set
Use CreateSetEffect to assign visibility through To. A set behavior does not interpolate between endpoints.
The example selects the visibility attribute and assigns the string visible when the behavior runs. The rectangle is already visible in this minimal presentation, so the assignment may not produce an obvious visual change on its own. Such an operation is useful as part of a larger effect that also controls when the shape becomes hidden or visible.
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.Appear, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var set = factory.CreateSetEffect();
set.Properties.Add(BehaviorProperty.StyleVisibility);
set.To = "visible";
effect.Behaviors.Add(set);
presentation.Save("set.pptx", SaveFormat.Pptx);
Perintah
Use CreateCommandEffect and configure Type, CommandString, and ShapeTarget. Place a WAV recording named sample.wav in the working directory. This example embeds it with AddAudioFrameEmbedded and attaches a play command to the audio frame.
The audio frame is both the effect’s target and the command’s target. This connects the play request to the embedded recording; a command string by itself does not identify which media object to control. The effect is configured to start on a click during the slideshow.
using System.IO;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
using var audioStream = File.OpenRead("sample.wav");
var audioFrame = slide.Shapes.AddAudioFrameEmbedded(100, 100, 40, 40, audioStream);
var effect = slide.Timeline.MainSequence.AddEffect(audioFrame, EffectType.MediaPlay, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var command = factory.CreateCommandEffect();
command.Type = CommandEffectType.Call;
command.CommandString = "play";
command.ShapeTarget = audioFrame;
effect.Behaviors.Add(command);
presentation.Save("command.pptx", SaveFormat.Pptx);
Saving stores the command in command.pptx; it does not play the recording. Playback requires a slideshow player that supports the command and its media target.
Mengelola Koleksi Perilaku
IBehaviorCollection supports Add, Insert, Remove, and RemoveAt. This example opens rotation.pptx, adds scaling, moves it before rotation, and removes the rotation. Removing and reinserting the same object changes its stored position without making a copy.
The sequence of edits changes the collection from rotation–scale to scale–rotation, then to scale only. Indices refer to the current collection, so the removal uses the rotation’s new index after reordering. The final enumeration confirms which behavior will be saved.
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("rotation.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var behaviors = effect.Behaviors;
IBehaviorFactory factory = new BehaviorFactory();
var scale = factory.CreateScaleEffect();
scale.To = new PointF(125, 125);
scale.Timing.Duration = 2f;
behaviors.Add(scale);
behaviors.Remove(scale);
behaviors.Insert(0, scale);
behaviors.RemoveAt(1);
foreach (var behavior in behaviors)
Console.WriteLine(behavior.GetType().Name);
presentation.Save("collection-edited.pptx", SaveFormat.Pptx);
The output is ScaleEffect: only scaling remains. Collection order does not, by itself, schedule behaviors one after another. Clear the collection only when replacing all its operations.
Mengonfigurasi Penjadwalan Perilaku
IBehavior.Timing exposes ITiming, independently of IEffect.Timing. Effect timing schedules the enclosing effect; behavior timing describes an operation inside it.
Atur Durasi, Penundaan, Pengulangan, dan Akselerasi
Open rotation.pptx and set Duration and TriggerDelayTime in seconds, then configure RepeatCount. Accelerate and Decelerate are fractions of the duration; keep their sum at most 1.
The input file is the one created in the rotation example, where the first behavior is known to be a rotation. This example changes only that behavior’s timing; its 90-degree angle remains intact. Keeping the angle and timing separate makes it easier to adjust the pace without rebuilding the animation.
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("rotation.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var rotation = (IRotationEffect)effect.Behaviors[0];
rotation.Timing.Duration = 2f;
rotation.Timing.TriggerDelayTime = 0.5f;
rotation.Timing.RepeatCount = 3f;
rotation.Timing.Accelerate = 0.2f;
rotation.Timing.Decelerate = 0.2f;
presentation.Save("timing.pptx", SaveFormat.Pptx);
The behavior uses a two-second duration, a half-second delay, and a repeat count of 3. The first and last 20% of its duration are used for acceleration and deceleration.
Other repeat policies include RepeatDuration, RepeatUntilEndSlide, and RepeatUntilNextClick; choose a policy rather than enabling them all together. AutoReverse plays the animation backwards after the forward pass. Acceleration and deceleration apply to continuous changes, not discrete assignments or commands.
Membuat Jalur Gerak
Use CreateMotionEffect to create motion. Its From, To, and By describe percentage-based coordinates or offsets. For an editable route, create a MotionPath and assign it to IMotionEffect.Path. IMotionPath stores the path commands.
MotionCommandPathType selects the operation:
| Perintah | Titik | Makna |
|---|---|---|
| MoveTo | Satu | Menetapkan posisi awal. |
| LineTo | Satu | Bergerak sepanjang segmen lurus ke titik akhirnya. |
| CurveTo | Tiga | Mengikuti kurva kubik yang didefinisikan oleh dua titik kontrol dan satu titik akhir. |
| CloseLoop | Tidak ada | Kembali ke posisi awal. |
| End | Tidak ada | Menyelesaikan jalur. |
MotionPathPointsType describes point-editing characteristics, such as corner or smooth points. It does not replace the command type. Use a curve point type for the curve example below, and a corner point type for the straight segments.
Path coordinates are normalized to slide dimensions: an X displacement of 0.25 represents one quarter of the slide width, not 0.25 points. Positive Y runs downward. Absolute commands specify positions in the path coordinate system; relative commands specify offsets from the current position. This is separate from Origin, which selects the path’s reference frame, and PathEditMode, which controls how the path moves when the shape is moved.
Buat Jalur Lurus
Create a motion behavior with a starting point, one straight segment, and an end command. IMotionPath.Add takes the command type, its points, the point type, and a relative-coordinate flag.
The starting command establishes (0, 0), and the line ends at (0.25, 0), giving the route a horizontal displacement of one quarter of the slide width. The ending command has no coordinate points. Once the path is assigned, adding the motion behavior to the effect connects that route to the rectangle.
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 160, 80);
var effect = slide.Timeline.MainSequence.AddEffect(shape, EffectType.PathRight, EffectSubtype.None, EffectTriggerType.OnClick);
effect.Behaviors.Clear();
IBehaviorFactory factory = new BehaviorFactory();
var motion = factory.CreateMotionEffect();
motion.Origin = MotionOriginType.Layout;
motion.Timing.Duration = 2f;
var path = new MotionPath();
path.Add(MotionCommandPathType.MoveTo, new[] { new PointF(0, 0) }, MotionPathPointsType.Auto, false);
path.Add(MotionCommandPathType.LineTo, new[] { new PointF(0.25f, 0) }, MotionPathPointsType.Corner, false);
path.Add(MotionCommandPathType.End, Array.Empty<PointF>(), MotionPathPointsType.None, false);
motion.Path = path;
effect.Behaviors.Add(motion);
presentation.Save("motion.pptx", SaveFormat.Pptx);
motion.pptx contains one motion behavior with three path commands. The following file-editing examples use this known structure.
Bandingkan Koordinat Absolut dan Relatif
These two path objects describe the same route. The absolute command ends at (0.3, 0.1); the relative command adds (0.1, 0.1) to the current position, (0.2, 0).
Both paths start at the same position. For the relative line, add its X and Y offsets to the current position to obtain the endpoint; for the absolute line, read the endpoint directly. Switching the flag without converting the coordinates would describe a different route.
using System.Drawing;
using Aspose.Slides.Animation;
var absolutePath = new MotionPath();
absolutePath.Add(MotionCommandPathType.MoveTo, new[] { new PointF(0.2f, 0) }, MotionPathPointsType.Auto, false);
absolutePath.Add(MotionCommandPathType.LineTo, new[] { new PointF(0.3f, 0.1f) }, MotionPathPointsType.Corner, false);
var relativePath = new MotionPath();
relativePath.Add(MotionCommandPathType.MoveTo, new[] { new PointF(0.2f, 0) }, MotionPathPointsType.Auto, false);
relativePath.Add(MotionCommandPathType.LineTo, new[] { new PointF(0.1f, 0.1f) }, MotionPathPointsType.Corner, true);
Assign either path to a motion behavior to use it in a presentation. The final Boolean argument selects relative coordinates for that command.
Ganti Garis dengan Kurva
Open motion.pptx and replace its line command with a cubic curve. Supply the two control points first, followed by the endpoint.
The starting position is supplied by the preceding command. The first two points shape the curve, while the third is its destination; they are not three successive destinations. Updating the command type, point-editing type, and point array together keeps the segment consistent with its new geometry.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
var path = motion.Path;
path[1].CommandType = MotionCommandPathType.CurveTo;
path[1].PointsType = MotionPathPointsType.CurveSmooth;
path[1].Points = new[] { new PointF(0.1f, 0), new PointF(0.2f, 0.1f), new PointF(0.3f, 0.1f) };
presentation.Save("curve.pptx", SaveFormat.Pptx);
The path in curve.pptx still has three commands; its middle command now defines a curve.
Memeriksa dan Menyunting Jalur yang Disimpan
Each IMotionCmdPath exposes Points, CommandType, PointsType, and IsRelative. The following examples use the known three-command path in motion.pptx. For arbitrary input, locate the intended effect and check command types and point counts before editing by index.
Baca Perintah dan Koordinat
Read the path without changing it. End and close-loop commands need no points, so allow for a null point array.
The output pairs each command with its relative-coordinate flag before listing its points. This lets you distinguish an endpoint from an offset before modifying the path. A curve would list three points, whereas the straight line in this file lists only one.
using System;
using Aspose.Slides;
using Aspose.Slides.Animation;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
var path = motion.Path;
foreach (var segment in path)
{
Console.WriteLine($"{segment.CommandType}, relative: {segment.IsRelative}");
if (segment.Points != null)
foreach (var point in segment.Points)
Console.WriteLine($"X={point.X}, Y={point.Y}");
}
The listing contains a starting point, an absolute line ending at (0.25, 0), and an end command.
Ubah Titik Akhir
Open motion.pptx and replace the line’s point array to move its endpoint.
In the input file, index 0 is the starting command and index 1 is the line. Replacing the line’s single point changes its destination without changing its command type, timing, or position in the collection. Because the command uses absolute coordinates, the new pair specifies a position rather than an added offset.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
motion.Path[1].Points = new[] { new PointF(0.4f, 0.1f) };
presentation.Save("motion-endpoint.pptx", SaveFormat.Pptx);
The line in motion-endpoint.pptx ends at (0.4, 0.1); the original file is unchanged.
Ganti Segmen
Use Insert and RemoveAt to replace the line in motion.pptx. Inserting shifts the old line to index 2.
This demonstrates replacing a command object rather than editing its existing coordinates. After insertion, the collection temporarily contains the starting command, the new line, the old line, and the end command. Removing index 2 discards the old line and leaves the new route in place.
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("motion.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
var motion = (IMotionEffect)effect.Behaviors[0];
var path = motion.Path;
path.Insert(1, MotionCommandPathType.LineTo, new[] { new PointF(0.2f, 0.1f) }, MotionPathPointsType.Corner, false);
path.RemoveAt(2);
presentation.Save("motion-edited.pptx", SaveFormat.Pptx);
The saved path still has three commands, with the new line ending at (0.2, 0.1) and the end command last.
Modifikasi dan Verifikasi Perilaku yang Ada
When the behavior’s index is unknown, select it by type. This example opens rotation.pptx, finds its IRotationEffect, changes the angle, and checks the saved value after reopening.
The type check allows the loop to skip behaviors that are not rotations. The second load reads the saved file into a separate presentation object, so the comparison checks persisted data rather than the value still held in memory. This example still assumes the known effect is first in the main sequence; selecting a behavior by type does not locate the correct effect in an arbitrary presentation.
using System;
using Aspose.Slides;
using Aspose.Slides.Animation;
using Aspose.Slides.Export;
using var presentation = new Presentation("rotation.pptx");
var effect = presentation.Slides[0].Timeline.MainSequence[0];
foreach (var behavior in effect.Behaviors)
{
if (behavior is IRotationEffect rotation)
rotation.By = 180f;
}
presentation.Save("rotation-edited.pptx", SaveFormat.Pptx);
using var reopened = new Presentation("rotation-edited.pptx");
var savedEffect = reopened.Slides[0].Timeline.MainSequence[0];
foreach (var behavior in savedEffect.Behaviors)
{
if (behavior is IRotationEffect rotation)
Console.WriteLine($"Rotation preserved: {Math.Abs(rotation.By - 180f) < 0.001f}");
}
The output is Rotation preserved: True. Apply the same type-checking pattern to other behaviors. For a complete preservation check, compare the target shape, effect, behavior types and order, timing, and path commands. Use a numeric tolerance for floating-point values. For a presentation with an unknown animation layout, see Read Shape Animations for traversal of main and interactive sequences.
Urutan Perilaku, Preset, dan Pemutaran
The order in IBehaviorCollection is the stored order of an effect’s operations. It is not a playlist in which every behavior automatically waits for the preceding one. Timing and the enclosing effect determine scheduling. Behaviors can overlap, and operations on the same property may interact through Additive and Accumulate. Do not use collection reordering alone to schedule “move, then rotate”; use explicit timing or separate effects as described in Shape Animation.
The effect’s Type and Subtype describe its preset. They are not a complete description of an edited behavior tree. Choose the preset and subtype before customizing behaviors: changing the preset can rebuild the collection and discard your custom operations. For example, changing a customized Spin effect to Fade can replace its rotation behavior with set and filter behaviors. Inspect the collection again after changing a preset or subtype. Clearing preset behaviors can also remove visibility or initialization operations that the preset needs. The examples deliberately use visible shapes and replace the behaviors; they do not reconstruct every preset’s implementation.
Kompatibilitas Format
A preserved behavior tree does not guarantee identical playback in every viewer or export renderer. Check the saved data and the rendered output separately.
| Format atau output | Apa yang harus diverifikasi |
|---|---|
| PPTX | Gunakan sebagai format utama untuk contoh-contoh ini. Buka kembali untuk memverifikasi pohon perilaku yang dapat diedit, kemudian periksa pemutaran pada versi PowerPoint yang dimaksud. |
| PPT | Representasi biner legacy dapat berbeda dari PPTX. Uji siklus simpan‑buka‑kembali terpisah dan pemutaran; jangan menyimpulkan dukungan untuk setiap kombinasi khusus dari hasil PPTX yang berhasil. |
| PDF, PNG, JPEG, dan gambar slide statis lainnya | Mengandung representasi slide statis, bukan timeline perilaku yang dapat diputar atau frame animasi akhir yang dijamin. |
| HTML5 | Dapat memutar animasi yang didukung ketika animasi bentuk diaktifkan dalam opsi ekspor. Uji kombinasi khusus di peramban. |
| Animated GIF | Menyimpan frame yang dirender, bukan perilaku yang dapat diedit atau interaksi pemicu-klik. Periksa gerakan yang sebenarnya dirender. |
| Video | Merender frame animasi dan mengenkodenya sebagai video. Dukungan terbatas pada animasi dan efek yang didukung oleh renderer; perintah dan peristiwa interaktif tidak menjadi timeline yang dapat diedit. |
Tanya Jawab
Mengapa efek saya berisi perilaku sebelum saya menambahkan apa pun?
Creating a predefined effect can create its underlying operations. Inspect them before deciding whether to extend the preset or replace its behaviors.
Apakah memindahkan perilaku ke awal membuatnya diputar terlebih dahulu?
Not necessarily. Collection order is not a substitute for timing. Check delays, durations, and interactions between operations on the same property.
Mengapa perintah end tidak memiliki titik?
It marks the end of the path and needs no coordinates. Check for a null point array when inspecting a path read from a file.
Apakah perjalanan balik yang berhasil cukup untuk mengonfirmasi pemutaran?
No. Reopening confirms preservation of the properties you checked. Test the slideshow player or animated export separately to confirm its visual behavior.