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/Menurut, Gambaran Umum Animasi Key-Frame, dan Gambaran Umum Animasi Jalur.

Karena kelas animasi mewarisi dari Freezable kelas , Anda harus terbiasa dengan Freezable objek 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 salah satu kelas *<Jenis>*AnimationBase.

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

Tabel berikut ini menjelaskan beberapa skenario untuk memperluas sistem animasi.

Saat Anda ingin ... Gunakan pendekatan ini
Mengkustomisasi interpolasi antara nilai jenis yang memiliki *<Jenis>*Animasi Yang SesuaiMenggunakanKeyFrames Buat bingkai kunci kustom. Untuk informasi selengkapnya, lihat bagian Membuat Bingkai Kunci Kustom.
Kustomisasi lebih dari sekadar interpolasi antara nilai tipe yang memiliki *<Tipe>*Animasi yang sesuai. Buat kelas animasi kustom yang mewarisi dari kelas *<Ketik>*AnimationBase yang sesuai dengan jenis yang ingin Anda animasikan. Untuk informasi selengkapnya, lihat bagian Membuat Kelas Animasi Kustom.
Menganimasikan jenis yang tidak memiliki animasi WPF yang sesuai ObjectAnimationUsingKeyFrames Gunakan 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 Membuat Callback Gunakan Per Bingkai.

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 propertinya Value .

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

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

Instruksi Implementasi

Berasal dari kelas abstrak *<Jenis>*KeyFrame dan terapkan metode InterpolateValueCore. Metode InterpolateValueCore mengembalikan nilai bingkai kunci saat ini. Dibutuhkan dua parameter: nilai bingkai kunci sebelumnya dan nilai kemajuan yang berkisar dari 0 hingga 1. Kemajuan 0 menunjukkan bingkai kunci baru saja dimulai, dan nilai 1 menunjukkan bahwa bingkai kunci baru saja selesai dan harus mengembalikan nilai yang ditentukan oleh propertinya Value .

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

Setelah membuat animasi *<Type>*KeyFrame kustom, Anda dapat menggunakannya dengan *<Type>*AnimationUsingKeyFrames untuk jenis 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 AnimationTimeline kelas atau kelas *<Ketik>*AnimationBase. Berasal dari kelas *<Ketik>*Animasi atau *<Tipe>*AnimasiUsingKeyFrames tidak disarankan.

Berasal dari <Type>AnimationBase

Berasal dari kelas *<Type>*AnimationBase adalah cara paling sederhana untuk membuat jenis animasi baru. Gunakan pendekatan ini saat Anda ingin membuat animasi baru untuk jenis yang sudah memiliki kelas *<Type>*AnimationBase yang sesuai.

Instruksi Implementasi

Berasal dari kelas *<Ketik>*Animasi dan terapkan 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 *<Jenis>*Kelas AnimationBase yang diwarisi dari Freezable kelas , Anda juga harus mengambil alih CreateInstanceCore inti untuk mengembalikan instans baru kelas Anda. Jika kelas tidak menggunakan properti dependensi untuk menyimpan datanya atau memerlukan inisialisasi tambahan setelah pembuatan, Anda mungkin perlu mengambil alih metode tambahan; lihat Gambaran Umum Objek Freezable untuk informasi selengkapnya.

Untuk informasi selengkapnya, lihat dokumentasi metode GetCurrentValueCore untuk kelas *<Type>*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 berasal dari salah satu kelas *<Jenis>*KeyFrame. Bingkai kunci yang Anda buat dapat digunakan dengan *<Type>*AnimationUsingKeyFrames yang sesuai yang disediakan oleh WPF.

Berasal dari AnimationTimeline

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

Instruksi Implementasi

Berasal dari AnimationTimeline kelas 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. AnimationClock Gunakan 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 GetCurrentValue metode .

  • 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 mengambil alih metode tambahan; lihat Gambaran Umum Objek Freezable untuk informasi selengkapnya.

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

  1. Buat kelas abstrak *<Ketik>*AnimationBase yang berasal dari AnimationTimeline. Kelas ini harus mengambil TargetPropertyType alih metode . 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 CreateInstanceCore metode , metode GetCurrentValueCore yang Anda perkenalkan, dan IsDestinationDefault properti .

Pendekatan Alternatif

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

Gunakan Panggilan Balik Per Bingkai

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 Rendering , Anda mendaftar untuk peristiwa objek yang berisi objek yang ingin Anda animasikan. Metode penanganan aktivitas ini dipanggil sekali per bingkai. Setiap kali WPF melakukan marsekal data penyajian yang bertahan di pohon visual di seberang pohon komposisi, metode penanganan aktivitas 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 ditransmisikan sebagai RenderingEventArgs, yang menyediakan RenderingTime properti yang dapat Anda gunakan untuk mendapatkan waktu penyajian bingkai saat ini.

Untuk informasi selengkapnya, lihat Rendering halaman.

Baca juga