Flutter Animation - Hukum Fisika Pada Animasi Widget | Koding Indonesia

Flutter Animation – Hukum Fisika Pada Animasi Widget

Untuk teman-teman yang akan baru memulai belajar Flutter silahkan masuk ke artikel ini dulu ya teman-teman ➡ Aplikasi Pertamaku “Halo Semuaaa…“. Jika sudah yuk lanjut baca artikel ini…

Jangan lupa baca artikel sebelumnya ya teman-temanMembuat Animasi Transisi Route.


Simulasi fisika dapat memberikan pengalaman interaksi pengguna pada aplikasi sehingga terasa realistis dan interaktif. Dalam hal ini, kita akan menganimasikan widget agar berfungsi seolah-olah widget tersebut terpasang ke pegas atau jatuh kembali karena tarikan gravitasi. Langkah-langkahnya sebagai berikut:

  1. Melakukan Set Up pada Animation Controller.
  2. Menggeser widget menggunakan gestures.
  3. Membuat animasi widget.
  4. Menghitung kecepatan untuk mensimulasikan gerakan pegas.

1. Melakukan Set Up pada Animation Controller

Dimulai dengan stateful widget yang disebut DraggableCard:

Langkah selanjutnya, buat kelas _DraggableCardState menjadi extend dari SingleTickerProviderStateMixin. Kemudian buat AnimationController di dalam initState dan set vsync ke this.

(Modifikasi dan tambahkan cuplikan kode berikut pada kelas _DraggableCardState)


2. Menggeser Widget Menggunakan Gestures

Agar sebuah widget dapat digerakkan saat digeser, maka kita perlu menambahkan field Alignment ke kelas _DraggableCardState:

Selanjutkan kita tambahkan GestureDetector yang fungsinya untuk menangani callback onPanDownonPanUpdate, danonPanEndSupaya dapat mengatur alignment, maka MediaQuery untuk mendapatkan ukuran widget, dan bagi dengan nilai 2 (fungsinya untuk mengonversi unit “piksel yang ditarik” ke koordinat yang digunakan Align). Kemudian, set alignment widget Align ke _dragAlignment:

(Modifikasi dan tambahkan cuplikan kode berikut pada kelas _DraggableCardState)


3. Membuat Animasi Widget

Nantinya saat widget digeser kemudian dilepas, akan memberikan efek spring yang membuat widget tersebut kembali ke tengah.

Selanjutnya tambahkan field Animation<Alignment> dan method _runAnimation fungsinya untuk mendefinisikan Tween yang menginterpolasi antara titik tempat widget ditarik ke titik di tengah.

(Modifikasi dan tambahkan cuplikan kode berikut pada kelas _DraggableCardState)

Selanjutnya, modifikasi _dragAlignment ketika AnimationController menghasilkan nilai:

Lalu, buat widget Align yang di dalamnya menggunakan field  _dragAlignment:

Terakhir, modifikasi GestureDetector untuk mengelola animation controller:


4. Menghitung Kecepatan Untuk Mensimulasikan Gerakan Pegas

Langkah terakhir adalah melakukan sedikit penghitungan kecepatan widget setelah selesai digeser, tujuannya agar widget melanjutkan gerakan secara realistis pada kecepatan tertentu sebelum widget dilepas kembali. (Method _runAnimation sudah memiliki sets arah dengan menyetel animasi alignment awal dan akhir)

Pertama, lakukan imporphysics package:

Perlu teman-teman ketahui, callback onPanEnd menyediakan objek DragEndDetails yang befungsi untuk memberikan kecepatan pointer saat berhenti menyentuh layar. Kecepatannya memiliki satuan piksel per detik, tetapi widget Align tidak menggunakan satuan piksel melainkan menggunakan nilai koordinat antara [-1.0, -1.0] dan [1.0, 1.0], di mana [0.0, 0.0] mewakili titik pusat.  Size yang dihitung pada langkah 2 digunakan untuk mengubah piksel menjadi nilai koordinat pada range yang sudah ditentukan.

Selanjutnya, AnimationController memiliki method animateWith() yang dapat diberikan class SpringSimulation:

Jangan lupa untuk memanggil _runAnimation() yang di dalamnya terdapat velocity dan size:

Berikut cuplikan kode dan simulasinya, jika teman-teman menggunakan VSCode jalankan projectnya dengan menekan F5, klik hot reload (⚡) atau klik tombol ▶, maka berikut hasil akhirnya (klik logo Flutter dan geser secara random ke kiri, kanan, atas dan bawah lalu lepas logo tersebut):


Jika ada pertanyaan silahkan komen dan jika artikel ini dirasa bermanfaat, jangan lupa like dan sharenya ya teman-teman. ??????? Sampai bertemu di artikel selanjutnya.
Terima Kasih, Assalamu’alaykum… Salam KODINGINDONESIA

Referensi : https://flutter.dev//

Anton Prafanto
Anton Prafanto
Konten developer kodingindonesia.com & staf pengajar tetap di Universitas Mulawarman Samarinda