Bagikan melalui


Gambaran Umum Animasi Kustom

Topik ini menjelaskan bagaimana dan kapan harus memperluas sistem animasi WPF dengan membuat bingkai kunci kustom, kelas animasi, atau dengan menggunakan panggilan balik per bingkai untuk melewatinya.

Prasyarat

Untuk memahami topik ini, Anda harus terbiasa dengan berbagai jenis animasi yang disediakan oleh WPF. Untuk informasi selengkapnya, lihat Gambaran Umum Animasi Dari/Ke/Oleh, Gambaran Umum Animasi Key-Frame, dan Gambaran Umum Animasi Jalur .

Karena kelas animasi mewarisi dari kelas Freezable, Anda harus terbiasa dengan objek Freezable dan cara mewarisi dari Freezable. Untuk informasi selengkapnya, lihat Gambaran Umum Objek yang Dapat Dibekukan .

Memperluas Sistem Animasi

Ada sejumlah cara untuk memperluas sistem animasi WPF, tergantung pada tingkat fungsionalitas bawaan yang ingin Anda gunakan. Ada tiga titik ekstensibilitas utama di mesin animasi WPF:

  • Buat objek bingkai kunci kustom dengan mewarisi dari salah satu kelas *<Jenis>*KeyFrame, seperti DoubleKeyFrame. Pendekatan ini menggunakan sebagian besar fungsionalitas bawaan mesin animasi WPF.

  • Buat kelas animasi Anda sendiri dengan mewarisi dari AnimationTimeline atau memilih dari salah satu kelas jenis<>AnimationBase.

  • Gunakan panggilan balik per bingkai untuk menghasilkan animasi berdasarkan per bingkai. Pendekatan ini sepenuhnya melewati sistem animasi dan pengaturan waktu.

Tabel berikut ini menjelaskan beberapa skenario untuk memperluas sistem animasi.

Ketika Anda ingin ... Gunakan pendekatan ini
Sesuaikan interpolasi antara nilai tipe yang memiliki tipe yang sesuai dengan *<>*AnimationUsingKeyFrames Buat bingkai kunci kustom. Untuk informasi selengkapnya, lihat bagian Membuat Bingkai Kunci Kustom.
Kustomisasi tidak hanya interpolasi antara nilai dari sebuah tipe yang memiliki *<Tipe>*Animasi yang sesuai. Buat kelas animasi khusus yang mewarisi dari kelas AnimationBase yang sesuai dengan jenis *<Type>* yang ingin Anda animasikan. Untuk informasi selengkapnya, lihat bagian Membuat Kelas Animasi Kustom.
Animasikan tipe yang tidak memiliki animasi WPF yang sepadan Gunakan ObjectAnimationUsingKeyFrames atau buat kelas yang mewarisi dari AnimationTimeline. Untuk informasi selengkapnya, lihat bagian Membuat Kelas Animasi Kustom.
Menganimasikan beberapa objek dengan nilai yang dihitung setiap bingkai dan didasarkan pada kumpulan interaksi objek terakhir Gunakan panggilan balik per bingkai. Untuk informasi selengkapnya, lihat bagian Buat Penggunaan Per-Frame Panggilan Balik.

Membuat Bingkai Kunci Kustom

Membuat kelas bingkai kunci kustom adalah cara paling sederhana untuk memperluas sistem animasi. Gunakan pendekatan ini saat Anda ingin menggunakan metode interpolasi yang berbeda untuk animasi bingkai kunci. Seperti yang dijelaskan dalam gambaran umum animasi Key-Frame, animasi bingkai kunci menggunakan objek bingkai kunci untuk menghasilkan nilai outputnya. Setiap objek bingkai kunci melakukan tiga fungsi:

  • Menentukan nilai target menggunakan properti Value.

  • Menentukan waktu di mana nilai tersebut harus dicapai menggunakan properti KeyTime.

  • Menginterpolasi antara nilai bingkai kunci sebelumnya dan nilainya sendiri dengan menerapkan metode InterpolateValueCore.

Instruksi Implementasi

Berasal dari kelas abstrak *<Type>*KeyFrame dan terapkan metode InterpolateValueCore. Metode InterpolateValueCore mengembalikan nilai bingkai kunci saat ini. Memerlukan dua parameter: nilai keyframe sebelumnya dan nilai kemajuan yang berkisar dari 0 hingga 1. Nilai kemajuan 0 menunjukkan bahwa bingkai kunci baru saja dimulai, dan nilai 1 menunjukkan bahwa bingkai kunci baru saja selesai dan seharusnya mengembalikan nilai yang ditentukan oleh properti Value.

Karena kelas *<Type>*KeyFrame mewarisi dari kelas Freezable, Anda juga harus mengambil alih inti CreateInstanceCore untuk mengembalikan instans baru kelas Anda. Jika kelas tidak menggunakan properti dependensi untuk menyimpan datanya atau memerlukan inisialisasi tambahan setelah pembuatan, Anda mungkin perlu mengganti metode tambahan; lihat Gambaran Umum Objek yang Dapat Dibekukan untuk informasi selengkapnya.

Setelah Anda membuat animasi KeyFrame kustom *<Tipe>*, Anda dapat menggunakannya dengan *<Tipe>*AnimationUsingKeyFrames untuk tipe tersebut.

Membuat Kelas Animasi Kustom

Membuat jenis animasi Anda sendiri memberi Anda lebih banyak kontrol atas bagaimana objek dalam animasi. Ada dua cara yang direkomendasikan untuk membuat jenis animasi Anda sendiri: Anda dapat memperoleh dari kelas AnimationTimeline atau *<Jenis>*kelas AnimationBase. Berasal dari kelas *<Tipe>*Animasi atau *<Tipe>*AnimationUsingKeyFrames tidak disarankan.

Berasal dari <Type>AnimationBase

Cara paling sederhana untuk membuat jenis animasi baru adalah dengan menggunakan kelas *<Type>*AnimationBase sebagai dasarnya. Gunakan pendekatan ini saat Anda ingin membuat animasi baru untuk jenis yang sudah memiliki kelas *<Tipe>*AnimationBase yang sesuai.

Instruksi Implementasi

Turunkan dari kelas *<Jenis>*Animasi dan implementasikan metode GetCurrentValueCore. Metode GetCurrentValueCore mengembalikan nilai animasi saat ini. Dibutuhkan tiga parameter: nilai awal yang disarankan, nilai akhir yang disarankan, dan AnimationClock, yang Anda gunakan untuk menentukan kemajuan animasi.

Karena kelas *<Type>*AnimationBase mewarisi dari kelas Freezable, Anda juga harus mengambil alih inti CreateInstanceCore untuk mengembalikan instans baru kelas Anda. Jika kelas tidak menggunakan properti dependensi untuk menyimpan datanya atau memerlukan inisialisasi tambahan setelah pembuatan, Anda mungkin perlu mengganti metode tambahan; lihat Gambaran Umum Objek yang Dapat Dibekukan untuk informasi selengkapnya.

Untuk informasi selengkapnya, lihat dokumentasi metode GetCurrentValueCore untuk kelas * jenis<>*AnimationBase untuk jenis yang ingin Anda animasikan. Misalnya, lihat Sampel Animasi Kustom

Pendekatan Alternatif

Jika Anda hanya ingin mengubah bagaimana nilai animasi diinterpolasi, pertimbangkan untuk menggunakan salah satu kelas *<Jenis>*KeyFrame. Bingkai kunci yang Anda buat dapat digunakan dengan * jenis<yang sesuai>*AnimationUsingKeyFrames yang disediakan oleh WPF.

Berasal dari AnimationTimeline

Berasal dari kelas AnimationTimeline ketika Anda ingin membuat animasi untuk jenis yang belum memiliki animasi WPF yang cocok, atau Anda ingin membuat animasi yang tidak dititik dengan kuat.

Instruksi Implementasi

Berasal dari kelas AnimationTimeline dan ambil alih anggota berikut:

  • CreateInstanceCore – Jika kelas baru Anda konkret, Anda harus mengambil alih CreateInstanceCore untuk mengembalikan instans baru kelas Anda.

  • GetCurrentValue – Ambil alih metode ini untuk mengembalikan nilai animasi Anda saat ini. Dibutuhkan tiga parameter: nilai asal default, nilai tujuan default, dan AnimationClock. Gunakan AnimationClock untuk mendapatkan waktu atau kemajuan saat ini untuk animasi. Anda dapat memilih apakah akan menggunakan nilai asal dan tujuan default.

  • IsDestinationDefault – Ambil alih properti ini untuk menunjukkan apakah animasi Anda menggunakan nilai tujuan default yang ditentukan oleh metode GetCurrentValue.

  • TargetPropertyType – Ambil alih properti ini untuk menunjukkan Type output yang dihasilkan animasi Anda.

Jika kelas tidak menggunakan properti dependensi untuk menyimpan datanya atau memerlukan inisialisasi tambahan setelah pembuatan, Anda mungkin perlu mengganti metode tambahan; lihat Gambaran Umum Objek yang Dapat Dibekukan untuk informasi selengkapnya.

Paradigma yang direkomendasikan (digunakan oleh animasi WPF) adalah menggunakan dua tingkat pewarisan:

  1. Buat kelas abstrak *<Jenis>*AnimationBase yang berasal dari AnimationTimeline. Kelas ini harus mengambil alih metode TargetPropertyType. Ini juga harus memperkenalkan metode abstrak baru, GetCurrentValueCore, dan mengambil alih GetCurrentValue sehingga memvalidasi jenis nilai asal default dan parameter nilai tujuan default, lalu memanggil GetCurrentValueCore.

  2. Buat kelas lain yang mewarisi dari kelas *<Type>*AnimationBase baru Anda dan ambil alih metode CreateInstanceCore, metode GetCurrentValueCore yang Anda perkenalkan, dan properti IsDestinationDefault.

Pendekatan Alternatif

Jika Anda ingin menganimasikan jenis yang tidak memiliki animasi From/To/By yang sesuai atau animasi bingkai kunci, pertimbangkan untuk menggunakan ObjectAnimationUsingKeyFrames. Karena diketik dengan lemah, ObjectAnimationUsingKeyFrames dapat menganimasikan semua jenis nilai. Kelemahan dari pendekatan ini adalah bahwa ObjectAnimationUsingKeyFrames hanya mendukung interpolasi diskrit.

Gunakan panggilan balik Per-Frame

Gunakan pendekatan ini ketika Anda perlu sepenuhnya melewati sistem animasi WPF. Salah satu skenario untuk pendekatan ini adalah animasi fisika, di mana pada setiap langkah animasi arah atau posisi baru objek animasi perlu dikomputasi ulang berdasarkan serangkaian interaksi objek terakhir.

Instruksi Implementasi

Tidak seperti pendekatan lain yang dijelaskan dalam gambaran umum ini, untuk menggunakan panggilan balik per bingkai, Anda tidak perlu membuat kelas animasi kustom atau bingkai kunci.

Sebagai gantinya, Anda mendaftar untuk acara Rendering dari objek yang berisi elemen-elemen yang ingin Anda animasikan. Metode penanganan peristiwa ini dipanggil sekali per frame. Setiap kali WPF memindahkan data penyajian yang tersimpan di pohon visual ke pohon komposisi, metode penanganan acara Anda dipanggil.

Di penanganan aktivitas Anda, lakukan perhitungan apa pun yang diperlukan untuk efek animasi Anda dan atur properti objek yang ingin Anda animasikan dengan nilai-nilai ini.

Untuk mendapatkan waktu presentasi bingkai saat ini, EventArgs yang terkait dengan peristiwa ini dapat dikonversi sebagai RenderingEventArgs, yang menyediakan properti RenderingTime yang dapat Anda gunakan untuk mendapatkan waktu pemrosesan bingkai saat ini.

Untuk informasi selengkapnya, lihat halaman Rendering.

Lihat juga