Buat dan Modifikasi Perilaku Animasi Kustom pada Android
Gambaran Umum
Perilaku animasi khusus memungkinkan Anda mengontrol operasi individu dalam sebuah efek animasi, seperti mengubah warna, memutar bentuk, atau mengikuti jalur gerakan yang dapat diedit. Panduan ini menunjukkan cara membuat dan menggabungkan perilaku, mengonfigurasi penjadwalannya, memeriksa dan mengubah animasi yang ada, serta memverifikasi bahwa propertinya tetap ada setelah menyimpan dan membuka kembali presentasi.
Untuk efek yang telah ditentukan sebelumnya dan pemicu klik, lihat Animasi Bentuk.
Memahami Model Animasi
Sebuah animasi diatur sebagai Timeline → Sequence → Effect → Behaviors:
- Metode getTimeline mengembalikan timeline slide, yang berisi urutan utama dan urutan interaktif.
- Sebuah ISequence berisi efek, yang mungkin menargetkan berbagai bentuk.
- Sebuah IEffect mengidentifikasi bentuk target, preset, subtype, dan penjadwalan efek.
- Koleksi yang dikembalikan oleh IEffect.getBehaviors berisi operasi yang melaksanakan efek: mengubah warna, memindahkan, memutar, mengatur properti, dan sebagainya.
Buat Perilaku Individu
Panggil ISequence.addEffect untuk membuat efek dan mengakses koleksi getBehaviors. Sebuah preset dapat mengisi koleksi ini secara otomatis. Pertahankan operasinya ketika memperluas preset, atau gunakan clear bila sengaja menggantinya.
IBehaviorFactory membuat delapan tipe perilaku yang diilustrasikan di bawah. Gerakan dibahas di Membangun Jalur Gerak. Setiap potongan kode menyertakan impor; letakkan pernyataan yang dapat dieksekusi di dalam sebuah metode. Contoh penyuntingan selanjutnya menyatakan file keluaran yang digunakan. Pada Android, ganti nama file contoh dengan jalur lengkap di direktori yang dapat diakses aplikasi, seperti direktori file aplikasi Anda.
Rotasi
Gunakan createRotationEffect untuk membuat rotasi. getBy menentukan sudut relatif dalam derajat; getFrom dan getTo menentukan titik akhir.
Contoh dimulai dengan efek Spin, mengganti operasi presetnya dengan satu perilaku rotasi, dan memberikan operasi tersebut durasi dua detik. Sudut relatif 90 derajat menyatakan seperempat putaran dari orientasi awal bentuk, sehingga tidak diperlukan sudut awal yang eksplisit.
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 berisi satu bentuk dan satu perilaku rotasi. Koleksi, penjadwalan, dan contoh penyuntingan rotasi di bawah menggunakan file ini.
Skala
Gunakan createScaleEffect dengan persentase X/Y: getFrom dan getTo menjelaskan ukuran awal dan akhir, sementara getBy menjelaskan perubahan relatif. Di sini, 100 berarti ukuran asli.
Contoh memperbesar kedua dimensi dari 100 % ke 125 % selama dua detik. Menggunakan persentase horizontal dan vertikal yang sama menjaga proporsi bentuk; persentase berbeda akan meregangkan satu dimensi lebih dari yang lain.
import com.aspose.slides.*;
import android.graphics.PointF;
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 PointF(100, 100));
scale.setTo(new PointF(125, 125));
scale.getTiming().setDuration(2f);
effect.getBehaviors().add(scale);
presentation.save("scale.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Warna
Gunakan createColorEffect untuk mengubah isi dari biru ke oranye. getFrom dan getTo adalah warna; getBy adalah offset warna. IBehavior.getProperties mengidentifikasi atribut yang dianimasikan.
Isi padat bentuk diinisialisasi ke biru, sesuai dengan warna awal animasi. Memilih atribut isi‑warna memberi tahu perilaku bagian mana dari bentuk yang akan diubah; titik akhir warna saja tidak mengidentifikasi atribut tersebut. Efek yang disimpan mendeskripsikan transisi dua detik ke oranye.
import com.aspose.slides.*;
import android.graphics.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);
int orange = Color.rgb(255, 165, 0);
color.getTo().setColor(orange);
color.getTiming().setDuration(2f);
effect.getBehaviors().add(color);
presentation.save("color.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Filter
Gunakan createFilterEffect untuk memilih wipe. getType, getSubtype, dan getReveal menentukan filter, arah, dan apakah menampilkan atau menyembunyikan bentuk.
Contoh ini mengonfigurasi wipe dua detik yang menampilkan bentuk menggunakan subtype arah kanan. Pengaturan filter merupakan bagian dari perilaku di dalam efek, sehingga dikonfigurasi setelah operasi asli preset dihapus.
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();
}
Properti
Gunakan createPropertyEffect untuk menganimasikan opasitas. getFrom, getTo, dan getBy adalah string yang diinterpretasikan menggunakan getValueType dan getCalcMode. Pilih titik akhir atau offset relatif daripada mengatur ketiganya secara serempak.
Di sini, atribut yang dipilih adalah opasitas, dan string numerik mewakili perubahan dari 25 % opasitas ke opasitas penuh. Interpolasi linier menggambarkan perubahan bertahap antara nilai‑nilai tersebut. Saat menyesuaikan contoh ini ke atribut lain, pilih tipe nilai dan nilai titik akhir yang sesuai dengan atribut tersebut.
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();
}
Setel
Gunakan createSetEffect untuk menetapkan visibilitas melalui getTo. Perilaku set tidak melakukan interpolasi antara titik akhir.
Contoh memilih atribut visibilitas dan menetapkan string visible ketika perilaku dijalankan. Persegi panjang sudah terlihat dalam presentasi minimal ini, sehingga penetapan tersebut mungkin tidak menghasilkan perubahan visual yang jelas secara terpisah. Operasi semacam ini berguna sebagai bagian dari efek yang lebih besar yang juga mengontrol kapan bentuk menjadi tersembunyi atau terlihat.
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();
}
Perintah
Gunakan createCommandEffect dan konfigurasikan getType, getCommandString, serta getShapeTarget. Letakkan rekaman WAV bernama sample.wav di direktori kerja. Contoh ini menyematkannya dengan addAudioFrameEmbedded dan menempelkan perintah play ke frame audio.
Frame audio adalah target efek sekaligus target perintah. Ini menghubungkan permintaan play ke rekaman yang disematkan; string perintah sendiri tidak mengidentifikasi objek media mana yang harus dikendalikan. Efek dikonfigurasikan untuk dimulai pada klik selama pertunjukan slide.
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();
}
Menyimpan menyimpan perintah dalam command.pptx; tidak memutar rekaman. Pemutaran memerlukan pemutar pertunjukan slide yang mendukung perintah dan target medianya.
Kelola Koleksi Perilaku
IBehaviorCollection mendukung add, insert, remove, dan removeAt. Contoh ini membuka rotation.pptx, menambahkan skala, memindahkannya sebelum rotasi, dan menghapus rotasi. Menghapus dan menyisipkan kembali objek yang sama mengubah posisi yang disimpannya tanpa membuat salinan.
Urutan penyuntingan mengubah koleksi dari rotasi‑skala menjadi skala‑rotasi, lalu menjadi hanya skala. Indeks mengacu pada koleksi saat ini, sehingga penghapusan menggunakan indeks baru rotasi setelah penataan ulang. Enumerasi akhir mengonfirmasi perilaku mana yang akan disimpan.
import com.aspose.slides.*;
import android.graphics.PointF;
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 PointF(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();
}
Keluaran adalah ScaleEffect: hanya skala yang tersisa. Urutan koleksi tidak, dengan sendirinya, menjadwalkan perilaku satu demi satu. Kosongkan koleksi hanya ketika mengganti semua operasinya.
Konfigurasikan Penjadwalan Perilaku
IBehavior.getTiming mengekspose ITiming, terlepas dari IEffect.getTiming. Penjadwalan efek mengatur efek yang membungkus; penjadwalan perilaku menjelaskan operasi di dalamnya.
Atur Durasi, Penundaan, Pengulangan, dan Akselerasi
Buka rotation.pptx dan atur durasi (getDuration) serta penundaan pemicu (getTriggerDelayTime) dalam detik, kemudian konfigurasikan jumlah pengulangan melalui setRepeatCount. getAccelerate dan getDecelerate adalah pecahan dari durasi; pertahankan jumlahnya maksimum 1.
File masukan adalah file yang dibuat pada contoh rotasi, di mana perilaku pertama diketahui merupakan rotasi. Contoh ini hanya mengubah penjadwalan perilaku itu; sudut 90 derajat tetap utuh. Memisahkan sudut dan penjadwalan membuat penyesuaian kecepatan lebih mudah tanpa membangun ulang animasi.
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();
}
Perilaku menggunakan durasi dua detik, penundaan setengah detik, dan hitungan pengulangan 3. 20 % pertama dan terakhir dari durasinya digunakan untuk akselerasi dan deselerasi.
Kebijakan pengulangan lain meliputi getRepeatDuration, getRepeatUntilEndSlide, dan getRepeatUntilNextClick; pilih satu kebijakan alih-alih mengaktifkan semuanya sekaligus. getAutoReverse memutar animasi mundur setelah putaran maju. Akselerasi dan deselerasi berlaku untuk perubahan kontinu, bukan penetapan diskrit atau perintah.
Bangun Jalur Gerak
Gunakan createMotionEffect untuk membuat gerakan. getFrom, getTo, dan getBy menjelaskan koordinat atau offset berbasis persentase. Untuk rute yang dapat diedit, buat sebuah MotionPath dan tetapkan dengan IMotionEffect.setPath. IMotionPath menyimpan perintah jalur.
MotionCommandPathType memilih operasi:
| Perintah | Titik | Makna |
|---|---|---|
| MoveTo | Satu | Menetapkan posisi awal. |
| LineTo | Satu | Menggerakkan 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 | Mengakhiri jalur. |
MotionPathPointsType menggambarkan karakteristik penyuntingan titik, seperti titik sudut atau halus. Ini tidak menggantikan tipe perintah. Gunakan tipe titik kurva untuk contoh kurva di bawah, dan tipe titik sudut untuk segmen lurus.
Koordinat jalur dinormalisasi terhadap dimensi slide: perpindahan X sebesar 0.25 mewakili seperempat lebar slide, bukan 0.25 poin. Y positif mengalir ke bawah. Perintah absolut menentukan posisi dalam sistem koordinat jalur; perintah relatif menentukan offset dari posisi saat ini. Ini terpisah dari getOrigin, yang memilih kerangka referensi jalur, dan getPathEditMode, yang mengontrol bagaimana jalur bergerak ketika bentuk dipindahkan.
Buat Jalur Lurus
Buat perilaku gerak dengan titik awal, satu segmen lurus, dan perintah akhir. IMotionPath.add menerima tipe perintah, titik‑titiknya, tipe titik, dan flag koordinat relatif.
Perintah awal menetapkan (0, 0), dan garis berakhir di (0.25, 0), memberi rute perpindahan horizontal seperempat lebar slide. Perintah akhir tidak memiliki titik koordinat. Setelah jalur ditetapkan, menambahkan perilaku gerak ke efek menghubungkan rute tersebut ke persegi panjang.
import com.aspose.slides.*;
import android.graphics.PointF;
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 PointF[] { new PointF(0, 0) }, MotionPathPointsType.Auto, false);
path.add(MotionCommandPathType.LineTo, new PointF[] { new PointF(0.25f, 0) }, MotionPathPointsType.Corner, false);
path.add(MotionCommandPathType.End, new PointF[0], MotionPathPointsType.None, false);
motion.setPath(path);
effect.getBehaviors().add(motion);
presentation.save("motion.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
motion.pptx berisi satu perilaku gerak dengan tiga perintah jalur. Contoh penyuntingan file berikut menggunakan struktur yang diketahui ini.
Bandingkan Koordinat Absolut dan Relatif
Kedua objek jalur ini menggambarkan rute yang sama. Perintah absolut berakhir di (0.3, 0.1); perintah relatif menambahkan (0.1, 0.1) ke posisi saat ini, (0.2, 0).
Kedua jalur memulai pada posisi yang sama. Untuk garis relatif, tambahkan offset X dan Y ke posisi saat ini untuk memperoleh titik akhir; untuk garis absolut, baca titik akhir secara langsung. Mengubah flag tanpa mengonversi koordinat akan menghasilkan rute yang berbeda.
import com.aspose.slides.*;
import android.graphics.PointF;
MotionPath absolutePath = new MotionPath();
absolutePath.add(MotionCommandPathType.MoveTo, new PointF[] { new PointF(0.2f, 0) }, MotionPathPointsType.Auto, false);
absolutePath.add(MotionCommandPathType.LineTo, new PointF[] { new PointF(0.3f, 0.1f) }, MotionPathPointsType.Corner, false);
MotionPath relativePath = new MotionPath();
relativePath.add(MotionCommandPathType.MoveTo, new PointF[] { new PointF(0.2f, 0) }, MotionPathPointsType.Auto, false);
relativePath.add(MotionCommandPathType.LineTo, new PointF[] { new PointF(0.1f, 0.1f) }, MotionPathPointsType.Corner, true);
Tetapkan salah satu jalur ke perilaku gerak untuk menggunakannya dalam presentasi. Argumen Boolean terakhir memilih koordinat relatif untuk perintah tersebut.
Ganti Garis dengan Kurva
Buka motion.pptx dan ganti perintah garisnya dengan kurva kubik. Sediakan dua titik kontrol terlebih dahulu, diikuti oleh titik akhir.
Posisi awal disediakan oleh perintah sebelumnya. Dua titik pertama membentuk kurva, sementara titik ketiga adalah tujuan akhir; mereka bukan tiga tujuan berurutan. Memperbarui tipe perintah, tipe penyuntingan titik, dan array titik secara bersamaan menjaga segmen tetap konsisten dengan geometri barunya.
import com.aspose.slides.*;
import android.graphics.PointF;
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 PointF[] { new PointF(0.1f, 0), new PointF(0.2f, 0.1f), new PointF(0.3f, 0.1f) });
presentation.save("curve.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Jalur dalam curve.pptx masih memiliki tiga perintah; perintah tengahnya kini mendefinisikan sebuah kurva.
Periksa dan Edit Jalur yang Disimpan
Setiap IMotionCmdPath mengekspose getPoints, getCommandType, getPointsType, dan isRelative. Contoh berikut menggunakan jalur tiga perintah yang diketahui dalam motion.pptx. Untuk masukan acak, temukan efek yang dimaksud dan periksa tipe perintah serta jumlah titik sebelum menyunting berdasarkan indeks.
Baca Perintah dan Koordinat
Baca jalur tanpa mengubahnya. Perintah end dan close‑loop tidak memerlukan titik, jadi sediakan array titik yang mungkin null.
Keluaran mencocokkan setiap tipe perintah numerik dengan flag koordinat relatifnya sebelum menyenaraikan titik‑titiknya. Ini memungkinkan Anda membedakan titik akhir dari offset sebelum memodifikasi jalur. Sebuah kurva akan menampilkan tiga titik, sedangkan garis lurus dalam file ini hanya menampilkan satu.
import com.aspose.slides.*;
import android.graphics.PointF;
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 (PointF point : segment.getPoints())
System.out.println("X=" + point.x + ", Y=" + point.y);
}
} finally {
presentation.dispose();
}
Daftar berisi titik awal, garis absolut yang berakhir di (0.25, 0), dan perintah end.
Ubah Titik Akhir
Buka motion.pptx dan ganti array titik garis untuk memindahkan titik akhirnya.
Dalam file masukan, indeks 0 adalah perintah awal dan indeks 1 adalah garis. Mengganti titik tunggal garis mengubah tujuan tanpa mengubah tipe perintah, penjadwalan, atau posisinya dalam koleksi. Karena perintah menggunakan koordinat absolut, pasangan baru menentukan posisi alih‑alih offset tambahan.
import com.aspose.slides.*;
import android.graphics.PointF;
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 PointF[] { new PointF(0.4f, 0.1f) });
presentation.save("motion-endpoint.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Garis dalam motion-endpoint.pptx berakhir di (0.4, 0.1); file asli tidak berubah.
Ganti Segmen
Gunakan insert dan removeAt untuk mengganti garis dalam motion.pptx. Penyisipan menggeser garis lama ke indeks 2.
Ini mendemonstrasikan penggantian objek perintah alih‑alih menyunting koordinat yang ada. Setelah penyisipan, koleksi sementara berisi perintah awal, garis baru, garis lama, dan perintah end. Menghapus indeks 2 membuang garis lama dan meninggalkan rute baru.
import com.aspose.slides.*;
import android.graphics.PointF;
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 PointF[] { new PointF(0.2f, 0.1f) }, MotionPathPointsType.Corner, false);
path.removeAt(2);
presentation.save("motion-edited.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Jalur yang disimpan masih memiliki tiga perintah, dengan garis baru berakhir di (0.2, 0.1) dan perintah end terakhir.
Modifikasi dan Verifikasi Perilaku yang Ada
Ketika indeks perilaku tidak diketahui, pilih berdasarkan tipe. Contoh ini membuka rotation.pptx, menemukan IRotationEffect, mengubah sudut, dan memeriksa nilai yang disimpan setelah dibuka kembali.
Pemeriksaan tipe memungkinkan loop melewatkan perilaku yang bukan rotasi. Muat kedua membaca file yang disimpan ke objek presentasi terpisah, sehingga perbandingan memeriksa data yang dipertahankan, bukan nilai yang masih berada di memori. Contoh ini masih mengasumsikan efek yang diketahui berada pertama dalam urutan utama; memilih perilaku berdasarkan tipe tidak menemukan efek yang tepat dalam presentasi acak.
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();
}
Keluaran adalah Rotation preserved: true. Terapkan pola pemeriksaan tipe yang sama untuk perilaku lain. Untuk pemeriksaan preservasi yang lengkap, bandingkan bentuk target, efek, tipe dan urutan perilaku, penjadwalan, serta perintah jalur. Gunakan toleransi numerik untuk nilai floating‑point. Untuk presentasi dengan tata letak animasi yang tidak diketahui, lihat Read Shape Animations untuk menelusuri urutan utama dan interaktif.
Urutan Perilaku, Preset, dan Pemutaran
Urutan dalam IBehaviorCollection adalah urutan yang disimpan dari operasi efek. Itu bukan playlist di mana setiap perilaku secara otomatis menunggu perilaku sebelumnya. Penjadwalan dan efek yang membungkus menentukan penjadwalan. Perilaku dapat tumpang‑tindih, dan operasi pada properti yang sama dapat berinteraksi melalui getAdditive dan getAccumulate. Jangan menggunakan penataan ulang koleksi saja untuk menjadwalkan “pindah, lalu putar”; gunakan penjadwalan eksplisit atau efek terpisah seperti dijelaskan di Animasi Bentuk.
ieffect.getType dan ieffect.getSubtype menggambarkan presetnya. Itu bukan deskripsi lengkap dari pohon perilaku yang disunting. Pilih preset dan subtype sebelum menyesuaikan perilaku: mengubah preset dapat membangun kembali koleksi dan membuang operasi khusus Anda. Misalnya, mengubah efek Spin yang disesuaikan menjadi Fade dapat mengganti perilaku rotasi dengan perilaku set dan filter. Periksa kembali koleksi setelah mengubah preset atau subtype. Mengosongkan perilaku preset juga dapat menghapus operasi visibilitas atau inisialisasi yang dibutuhkan preset. Contoh sengaja menggunakan bentuk yang terlihat dan mengganti perilakunya; mereka tidak membangun ulang implementasi setiap preset.
Kompatibilitas Format
Pohon perilaku yang dipertahankan tidak menjamin pemutaran identik di setiap penampil atau renderer ekspor. Periksa data yang disimpan dan output yang dirender secara terpisah.
| Format atau output | Apa yang harus diverifikasi |
|---|---|
| PPTX | Gunakan sebagai format utama untuk contoh ini. Buka kembali untuk memverifikasi pohon perilaku yang dapat diedit, lalu periksa pemutaran pada versi PowerPoint yang dituju. |
| PPT | Representasi biner lama dapat berbeda dari PPTX. Uji siklus simpan‑dan‑buka terpisah serta pemutaran; jangan menyimpulkan dukungan untuk setiap kombinasi khusus hanya dari output PPTX yang berhasil. |
| PDF, PNG, JPEG, dan gambar slide statis lainnya | Berisi 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 klik. Periksa gerakan yang sebenarnya dirender. |
| Video | Merender frame animasi dan mengenkodenya sebagai video. Dukungan terbatas pada animasi dan efek yang didukung; perintah dan event interaktif tidak menjadi timeline yang dapat diedit. |
FAQ
Mengapa efek saya berisi perilaku sebelum saya menambahkan apa pun?
Membuat efek yang telah ditentukan sebelumnya dapat membuat operasi dasarnya. Periksa mereka sebelum memutuskan memperluas preset atau mengganti perilakunya.
Apakah memindahkan perilaku ke awal membuatnya diputar pertama?
Tidak selalu. Urutan koleksi bukan pengganti penjadwalan. Periksa penundaan, durasi, dan interaksi antara operasi pada properti yang sama.
Mengapa perintah end tidak memiliki titik?
Itu menandai akhir jalur dan tidak memerlukan koordinat. Periksa array titik null saat memeriksa jalur yang dibaca dari file.
Apakah putaran sukses cukup untuk mengonfirmasi pemutaran?
Tidak. Membuka kembali mengonfirmasi preservasi properti yang Anda periksa. Uji pemutar pertunjukan slide atau ekspor animasi secara terpisah untuk mengonfirmasi perilaku visualnya.