Animasi Sederhana di Xamarin.Forms
Kelas ViewExtensions menyediakan metode ekstensi yang dapat digunakan untuk membangun animasi sederhana. Artikel ini menunjukkan pembuatan dan pembatalan animasi menggunakan kelas ViewExtensions.
Kelas ini ViewExtensions
menyediakan metode ekstensi berikut yang dapat digunakan untuk membuat animasi sederhana:
CancelAnimations
membatalkan animasi apa pun.FadeTo
menganimasikanOpacity
properti dariVisualElement
.RelScaleTo
menerapkan peningkatan atau penurunan inkremental animasi keScale
properti .VisualElement
RotateTo
menganimasikanRotation
properti dariVisualElement
.RelRotateTo
menerapkan peningkatan atau penurunan inkremental animasi keRotation
properti .VisualElement
RotateXTo
menganimasikanRotationX
properti dariVisualElement
.RotateYTo
menganimasikanRotationY
properti dariVisualElement
.ScaleTo
menganimasikanScale
properti dariVisualElement
.ScaleXTo
menganimasikanScaleX
properti dariVisualElement
.ScaleYTo
menganimasikanScaleY
properti dariVisualElement
.TranslateTo
menganimasikanTranslationX
properti danTranslationY
dariVisualElement
.
Secara default, setiap animasi akan memakan waktu 250 milidetik. Namun, durasi untuk setiap animasi dapat ditentukan saat membuat animasi.
Catatan
Kelas ini ViewExtensions
menyediakan LayoutTo
metode ekstensi. Namun, metode ini dimaksudkan untuk digunakan oleh tata letak untuk menganimasikan transisi antara status tata letak yang berisi perubahan ukuran dan posisi. Oleh karena itu, itu hanya boleh digunakan oleh Layout
subkelas.
Metode ekstensi animasi di ViewExtensions
kelas semuanya asinkron dan mengembalikan Task<bool>
objek. Nilai yang dikembalikan adalah false
jika animasi selesai, dan true
jika animasi dibatalkan. Oleh karena itu, metode animasi biasanya harus digunakan dengan await
operator, yang memungkinkan untuk dengan mudah menentukan kapan animasi telah selesai. Selain itu, kemudian menjadi mungkin untuk membuat animasi berurutan dengan metode animasi berikutnya yang dijalankan setelah metode sebelumnya selesai. Untuk informasi selengkapnya, lihat Animasi Majemuk.
Jika ada persyaratan untuk membiarkan animasi selesai di latar belakang, maka await
operator dapat dihilangkan. Dalam skenario ini, metode ekstensi animasi akan dengan cepat kembali setelah memulai animasi, dengan animasi yang terjadi di latar belakang. Operasi ini dapat dimanfaatkan saat membuat animasi komposit. Untuk informasi selengkapnya, lihat Animasi Komposit.
Untuk informasi selengkapnya tentang await
operator, lihat Gambaran Umum Dukungan Asinkron.
Animasi Tunggal
Setiap metode ekstensi dalam ViewExtensions
mengimplementasikan satu operasi animasi yang secara progresif mengubah properti dari satu nilai ke nilai lain selama periode waktu tertentu. Bagian ini menjelajahi setiap operasi animasi.
Rotasi
Contoh kode berikut menunjukkan menggunakan RotateTo
metode untuk menganimasikan Rotation
properti dari Image
:
await image.RotateTo (360, 2000);
image.Rotation = 0;
Kode ini menganimasikan instans Image
dengan memutar hingga 360 derajat lebih dari 2 detik (2000 milidetik). Metode ini RotateTo
memperoleh nilai properti saat ini Rotation
untuk awal animasi, lalu memutar dari nilai tersebut ke argumen pertamanya (360). Setelah animasi selesai, properti gambar Rotation
diatur ulang ke 0. Ini memastikan bahwa Rotation
properti tidak tetap di 360 setelah animasi menyimpulkan, yang akan mencegah rotasi tambahan.
Cuplikan layar berikut menunjukkan rotasi yang sedang berlangsung di setiap platform:
Catatan
Selain metode , RotateTo
ada juga RotateXTo
metode dan RotateYTo
yang menganimasikan RotationX
properti dan RotationY
, masing-masing.
Rotasi Relatif
Contoh kode berikut menunjukkan penggunaan RelRotateTo
metode untuk meningkatkan atau mengurangi Rotation
properti secara bertahap dari Image
:
await image.RelRotateTo (360, 2000);
Kode ini menganimasikan instans Image
dengan memutar 360 derajat dari posisi awalnya selama 2 detik (2000 milidetik). Metode ini RelRotateTo
memperoleh nilai properti saat ini Rotation
untuk awal animasi, lalu memutar dari nilai tersebut ke nilai ditambah argumen pertamanya (360). Ini memastikan bahwa setiap animasi akan selalu menjadi rotasi 360 derajat dari posisi awal. Oleh karena itu, jika animasi baru dipanggil saat animasi sudah berlangsung, animasi akan dimulai dari posisi saat ini dan dapat berakhir pada posisi yang bukan kenaikan 360 derajat.
Cuplikan layar berikut menunjukkan rotasi relatif yang sedang berlangsung di setiap platform:
Penskalaan
Contoh kode berikut menunjukkan menggunakan ScaleTo
metode untuk menganimasikan Scale
properti dari Image
:
await image.ScaleTo (2, 2000);
Kode ini menganimasikan instans dengan menskalakan Image
hingga dua kali ukurannya lebih dari 2 detik (2000 milidetik). Metode ini ScaleTo
memperoleh nilai properti saat ini Scale
(nilai default 1) untuk awal animasi, lalu menskalakan dari nilai tersebut ke argumen pertamanya (2). Ini memiliki efek memperluas ukuran gambar menjadi dua kali ukurannya.
Cuplikan layar berikut menunjukkan skala yang sedang berlangsung di setiap platform:
Catatan
Selain metode , ScaleTo
ada juga ScaleXTo
metode dan ScaleYTo
yang menganimasikan ScaleX
properti dan ScaleY
, masing-masing.
Penskalakan Relatif
Contoh kode berikut menunjukkan menggunakan RelScaleTo
metode untuk menganimasikan Scale
properti dari Image
:
await image.RelScaleTo (2, 2000);
Kode ini menganimasikan instans dengan menskalakan Image
hingga dua kali ukurannya lebih dari 2 detik (2000 milidetik). Metode ini RelScaleTo
memperoleh nilai properti saat ini Scale
untuk awal animasi, lalu menskalakan dari nilai tersebut ke nilai ditambah argumen pertamanya (2). Ini memastikan bahwa setiap animasi akan selalu menjadi penskalaan 2 dari posisi awal.
Penskalaan dan Rotasi dengan Jangkar
Properti AnchorX
dan AnchorY
mengatur pusat penskalaan atau rotasi untuk Rotation
properti dan Scale
. Oleh karena itu, nilai-nilainya juga memengaruhi RotateTo
metode dan ScaleTo
.
Image
Mengingat yang telah ditempatkan di tengah tata letak, contoh kode berikut menunjukkan pemutaran gambar di sekitar pusat tata letak dengan mengatur propertinyaAnchorY
:
double radius = Math.Min(absoluteLayout.Width, absoluteLayout.Height) / 2;
image.AnchorY = radius / image.Height;
await image.RotateTo(360, 2000);
Untuk memutar instans di Image
sekitar pusat tata letak, AnchorX
properti dan AnchorY
harus diatur ke nilai yang relatif terhadap lebar dan tinggi Image
. Dalam contoh ini, pusat Image
didefinisikan berada di tengah tata letak, sehingga nilai default AnchorX
0,5 tidak memerlukan perubahan. Namun, AnchorY
properti ditentukan ulang menjadi nilai dari bagian Image
atas ke titik tengah tata letak. Ini memastikan bahwa membuat rotasi penuh 360 derajat di sekitar titik tengah tata letak, seperti yang Image
ditunjukkan pada cuplikan layar berikut:
Terjemahan
Contoh kode berikut menunjukkan menggunakan TranslateTo
metode untuk menganimasikan TranslationX
properti dan TranslationY
dari Image
:
await image.TranslateTo (-100, -100, 1000);
Kode ini menganimasikan instans Image
dengan menerjemahkannya secara horizontal dan vertikal lebih dari 1 detik (1000 milidetik). Metode ini TranslateTo
secara bersamaan menerjemahkan gambar 100 piksel ke kiri, dan 100 piksel ke atas. Ini karena argumen pertama dan kedua adalah angka negatif. Memberikan angka positif akan menerjemahkan gambar ke kanan, dan ke bawah.
Cuplikan layar berikut menunjukkan terjemahan yang sedang berlangsung di setiap platform:
Catatan
Jika elemen awalnya diletakkan di luar layar dan kemudian diterjemahkan ke layar, setelah terjemahan tata letak input elemen tetap di luar layar dan pengguna tidak dapat berinteraksi dengannya. Oleh karena itu, disarankan agar tampilan harus ditata dalam posisi terakhirnya, dan kemudian terjemahan yang diperlukan dilakukan.
Memudar
Contoh kode berikut menunjukkan menggunakan FadeTo
metode untuk menganimasikan Opacity
properti dari Image
:
image.Opacity = 0;
await image.FadeTo (1, 4000);
Kode ini menganimasikan instans Image
dengan memudarkannya dalam lebih dari 4 detik (4000 milidetik). Metode ini FadeTo
memperoleh nilai properti saat ini Opacity
untuk awal animasi, lalu memudar dari nilai tersebut ke argumen pertamanya (1).
Cuplikan layar berikut menunjukkan pudarnya yang sedang berlangsung di setiap platform:
Animasi Majemuk
Animasi majemuk adalah kombinasi animasi berurutan, dan dapat dibuat dengan await
operator, seperti yang ditunjukkan dalam contoh kode berikut:
await image.TranslateTo (-100, 0, 1000); // Move image left
await image.TranslateTo (-100, -100, 1000); // Move image diagonally up and left
await image.TranslateTo (100, 100, 2000); // Move image diagonally down and right
await image.TranslateTo (0, 100, 1000); // Move image left
await image.TranslateTo (0, 0, 1000); // Move image up
Dalam contoh ini, diterjemahkan Image
lebih dari 6 detik (6000 milidetik). Terjemahan menggunakan Image
lima animasi, dengan await
operator menunjukkan bahwa setiap animasi dijalankan secara berurutan. Oleh karena itu, metode animasi berikutnya dijalankan setelah metode sebelumnya selesai.
Animasi Komposit
Animasi komposit adalah kombinasi animasi di mana dua atau beberapa animasi berjalan secara bersamaan. Animasi komposit dapat dibuat dengan mencampur animasi yang ditunggu dan tidak ditunggu, seperti yang ditunjukkan dalam contoh kode berikut:
image.RotateTo (360, 4000);
await image.ScaleTo (2, 2000);
await image.ScaleTo (1, 2000);
Dalam contoh ini, Image
diskalakan dan diputar secara bersamaan selama 4 detik (4000 milidetik). Penskalaan Image
menggunakan dua animasi berurutan yang terjadi pada saat yang sama dengan rotasi. Metode RotateTo
dijalankan tanpa await
operator dan segera kembali, dengan animasi pertama ScaleTo
kemudian dimulai. Operator await
pada panggilan metode pertama ScaleTo
menunda panggilan metode kedua ScaleTo
hingga panggilan metode pertama ScaleTo
selesai. Pada titik RotateTo
ini animasi setengah jalan selesai dan Image
akan diputar 180 derajat. Selama 2 detik terakhir (2000 milidetik), animasi kedua ScaleTo
dan RotateTo
animasi keduanya selesai.
Menjalankan Beberapa Metode Asinkron Secara Bersamaan
Metode static
Task.WhenAny
dan Task.WhenAll
digunakan untuk menjalankan beberapa metode asinkron secara bersamaan, dan oleh karena itu dapat digunakan untuk membuat animasi komposit. Kedua metode mengembalikan Task
objek dan menerima kumpulan metode yang masing-masing mengembalikan Task
objek. Metode Task.WhenAny
selesai ketika metode apa pun dalam koleksinya menyelesaikan eksekusi, seperti yang ditunjukkan dalam contoh kode berikut:
await Task.WhenAny<bool>
(
image.RotateTo (360, 4000),
image.ScaleTo (2, 2000)
);
await image.ScaleTo (1, 2000);
Dalam contoh ini, Task.WhenAny
panggilan metode berisi dua tugas. Tugas pertama memutar gambar lebih dari 4 detik (4000 milidetik), dan tugas kedua menskalakan gambar lebih dari 2 detik (2000 milidetik). Ketika tugas kedua selesai, Task.WhenAny
panggilan metode selesai. Namun, meskipun RotateTo
metode masih berjalan, metode kedua ScaleTo
dapat dimulai.
Metode Task.WhenAll
ini selesai ketika semua metode dalam koleksinya telah selesai, seperti yang ditunjukkan dalam contoh kode berikut:
// 10 minute animation
uint duration = 10 * 60 * 1000;
await Task.WhenAll (
image.RotateTo (307 * 360, duration),
image.RotateXTo (251 * 360, duration),
image.RotateYTo (199 * 360, duration)
);
Dalam contoh ini, Task.WhenAll
panggilan metode berisi tiga tugas, yang masing-masing dijalankan lebih dari 10 menit. Masing-masing Task
membuat jumlah rotasi 360 derajat yang berbeda - 307 rotasi untuk RotateTo
, 251 rotasi untuk RotateXTo
, dan 199 rotasi untuk RotateYTo
. Nilai-nilai ini adalah angka utama, oleh karena itu memastikan bahwa rotasi tidak disinkronkan dan karenanya tidak akan menghasilkan pola berulang.
Cuplikan layar berikut menunjukkan beberapa rotasi yang sedang berlangsung di setiap platform:
Membatalkan Animasi
Aplikasi dapat membatalkan satu atau beberapa animasi dengan panggilan ke CancelAnimations
metode ekstensi, seperti yang ditunjukkan dalam contoh kode berikut:
image.CancelAnimations();
Ini akan segera membatalkan semua animasi yang saat ini berjalan pada Image
instans.
Ringkasan
Artikel ini menunjukkan pembuatan dan pembatalan animasi menggunakan ViewExtensions
kelas . Kelas ini menyediakan metode ekstensi yang dapat digunakan untuk membuat animasi sederhana yang memutar, menskalakan, menerjemahkan, dan memudarkan VisualElement
instans.