Property Animation — sistem animasi di Android, diperkenalkan di Android 3.0 (API 11), yang mengubah properti nyata objek (bukan hanya View) dalam interval waktu tertentu. Tidak seperti View Animation yang sudah usang, Property Animation mengubah field aktual objek — koordinat, ukuran, transparansi, warna — bukan hanya tampilan visual. Menurut Google Android Developers (2026), Property Animation digunakan di 89% aplikasi Android dari top-100. Baca lebih lanjut tentang jenis animasi lainnya di panduan umum animasi.
Poin Utama
Property Animation — adalah framework di Android SDK (paket android.animation) yang menganimasikan properti apa pun dari objek apa pun (View, Drawable, kelas kustom) dalam waktu tertentu. Tidak seperti View Animation yang hanya bekerja dengan View dan hanya mengubah tampilan visual (matrix transform), Property Animation mengubah field nyata objek. Ini berarti setelah animasi translationX, objek benar-benar berada di posisi baru, dan klik diproses di lokasi baru.
Arsitektur Property Animation dibangun di atas tiga kelas kunci: ValueAnimator — generator nilai dasar, ObjectAnimator — subkelas untuk mengikat ke properti objek, AnimatorSet — orkestrator untuk animasi grup. Ketiganya mendukung Interpolator (kurva kecepatan) dan TypeEvaluator (aturan interpolasi antar nilai).
Menurut Android Performance Patterns (Google, 2025), Property Animation bekerja pada frekuensi hingga 60 FPS dengan Interpolator yang dikonfigurasi dengan benar dan tanpa perhitungan berat di onAnimationUpdate(). Untuk animasi kompleks (3D, fisika) disarankan RenderThread (RenderNode Animations) di Android 12+. Property Animation tetap menjadi pilihan utama untuk animasi properti View — translationX, rotationY, scaleX, alpha dan lainnya.
ObjectAnimator — kelas paling populer dari Property Animation. Ia mewarisi dari ValueAnimator dan secara otomatis memanggil setter properti yang ditentukan dari objek dengan nilai animasi. Untuk bekerja, ObjectAnimator memerlukan objek memiliki setter publik untuk properti yang dianimasikan (misalnya, setTranslationX(float) untuk properti «translationX»).
import android.animation.ObjectAnimator
import android.view.View
// ObjectAnimator untuk translationX
val animator = ObjectAnimator.ofFloat(
myView,
"translationX",
0f,
300f
).apply {
duration = 500L
startDelay = 200L
repeatCount = 1
repeatMode = ValueAnimator.REVERSE
interpolator = FastOutSlowInInterpolator()
start()
}
Properti View yang didukung: translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. ObjectAnimator.ofFloat() digunakan untuk properti float, ofInt() — untuk int, ofObject() — untuk tipe kustom (warna, titik). Untuk animasi warna gunakan ofObject() dengan ArgbEvaluator atau HsvEvaluator.
// ObjectAnimator dengan TypeEvaluator kustom (warna)
import android.animation.ObjectAnimator
import android.animation.ArgbEvaluator
import android.graphics.Color
val colorAnim = ObjectAnimator.ofObject(
myView,
"backgroundColor",
ArgbEvaluator(),
Color.BLUE,
Color.RED
).apply {
duration = 1000L
repeatCount = ValueAnimator.INFINITE
repeatMode = ValueAnimator.REVERSE
start()
}
// Animasi beberapa properti secara bersamaan
val scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.5f)
val scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 1f, 1.5f)
val alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1f, 0.5f)
AnimatorListener — antarmuka untuk melacak peristiwa animasi: onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Gunakan AnimatorListenerAdapter untuk menimpa hanya metode yang diperlukan. Mulai Android 12, ditambahkan Animator.AnimationCallback dengan dukungan korutin melalui suspendAnimationFrame.
ValueAnimator — kelas dasar Property Animation yang menghasilkan nilai animasi dari start hingga end dalam waktu tertentu. Tidak seperti ObjectAnimator, ValueAnimator tidak terikat ke objek — ia hanya menghitung nilai antara dan memberi tahu melalui pendengar. Pengembang sendiri yang memutuskan apa yang akan dilakukan dengan nilai yang diterima: mengatur properti View, mengubah parameter Drawable, memperbarui gambar kustom di onDraw().
import android.animation.ValueAnimator
import android.view.animation.LinearInterpolator
"> ValueAnimator: animasi progres pemuatan
val valueAnimator = ValueAnimator.ofFloat(0f, 100f).apply {
duration = 2000L
interpolator = LinearInterpolator()
repeatCount = ValueAnimator.INFINITE
addUpdateListener { animator ->
val progress = animator.animatedValue as Float
progressBar.progress = progress.toInt()
progressText.text = "${progress.toInt()}%"
}
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationRepeat(animation: Animator) {
Log.d("Anim", "Progress animation restarted")
}
})
start()
}
ValueAnimator.ofInt() — digunakan untuk properti bilangan bulat (lebar, tinggi, jumlah langkah). ValueAnimator.ofObject() — untuk tipe kustom dengan TypeEvaluator. ValueAnimator.ofPropertyValuesHolder() — untuk animasi paralel beberapa properti dengan satu timer, yang menghemat sumber daya dibandingkan Animator terpisah untuk setiap properti.
// ValueAnimator.ofObject dengan PointEvaluator
import android.animation.ValueAnimator
import android.graphics.PointF
import android.animation.PointFEvaluator
val pointAnim = ValueAnimator.ofObject(
PointFEvaluator(),
PointF(0f, 0f),
PointF(300f, 500f)
).apply {
duration = 1000L
addUpdateListener { animator ->
val point = animator.animatedValue as PointF
movingView.x = point.x
movingView.y = point.y
}
start()
}
Kinerja ValueAnimator: pada frekuensi 60 FPS, onAnimationUpdate dipanggil setiap ~16.7 ms. Hindari di dalam pendengar: alokasi objek (buat PointF/RectF sekali), memanggil findViewById(), perhitungan berat (I/O file, jaringan). Untuk animasi 20+ elemen simultan gunakan PropertyValuesHolder dalam satu Animator daripada 20 Animator terpisah. Untuk animasi dengan perubahan ukuran gunakan View.setLayoutParams() hanya di akhir animasi (melalui AnimatorListenerAdapter.onAnimationEnd).
AnimatorSet — orkestrator yang memungkinkan menjalankan beberapa Animator (ObjectAnimator, ValueAnimator) dalam urutan tertentu: berurutan (playSequentially), paralel (playTogether), dengan penundaan (after, before, with). AnimatorSet mendukung bersarang — AnimatorSet dapat berisi AnimatorSet lain untuk skenario kompleks.
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
// AnimatorSet: animasi berurutan dan paralel
val fadeIn = ObjectAnimator.ofFloat(myView, "alpha", 0f, 1f)
val slideUp = ObjectAnimator.ofFloat(myView, "translationY", 100f, 0f)
val bounce = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.1f, 1f)
val animatorSet = AnimatorSet().apply {
// Paralel: fadeIn + slideUp
play(fadeIn).with(slideUp)
"> Setelah: bounce dengan penundaan 200ms
play(bounce).after(200L)
duration = 400L
interpolator = FastOutSlowInInterpolator()
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
Log.d("Anim", "Set completed")
}
})
start()
}
AnimatorSet.Builder menyediakan API fluent untuk membangun rantai: with() — paralel, before() — sebelum, after() — setelah. AnimatorSet mendukung cancel() untuk menghentikan semua animasi dalam set. Untuk skenario kompleks (25+ animator) gunakan PropertyValuesHolder — lebih efisien karena menggunakan satu timer bersama alih-alih timer terpisah untuk setiap Animator.
| Metode Builder | Deskripsi | Contoh |
|---|---|---|
| with(Animator) | Menjalankan paralel dengan animasi saat ini | play(fadeIn).with(slideUp) |
| before(Animator) | Animasi saat ini sebelum yang ditentukan | play(fadeIn).before(bounce) |
| after(Animator) | Animasi saat ini setelah yang ditentukan | play(bounce).after(slideUp) |
| after(Long) | Penundaan sebelum animasi saat ini | play(bounce).after(200L) |
Interpolator menentukan kurva perubahan kecepatan animasi dari 0 hingga 1. Android menyediakan Interpolator bawaan: LinearInterpolator (seragam), AccelerateDecelerateInterpolator (lambat-cepat-lambat), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (dengan melampaui target), BounceInterpolator (dengan memantul), AnticipateOvershootInterpolator (dengan mundur sebelum mulai dan melampaui target). Interpolator kustom diimplementasikan melalui TimeInterpolator.
import android.animation.ObjectAnimator
import android.view.animation.BounceInterpolator
import android.view.animation.OvershootInterpolator
import android.view.animation.AnticipateOvershootInterpolator
// BounceInterpolator — efek memantul di akhir
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
duration = 600L
interpolator = BounceInterpolator()
start()
}
// AnticipateOvershoot — mundur, lalu melampaui
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
duration = 500L
interpolator = AnticipateOvershootInterpolator(2.0f)
start()
}
TypeEvaluator — antarmuka dengan metode evaluate(fraction, startValue, endValue) yang menghitung nilai antara start dan end. Bawaan: ArgbEvaluator (warna int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. Untuk tipe data kustom (misalnya, animasi kelas kustom dengan tiga field) implementasikan TypeEvaluator Anda sendiri. Untuk animasi beberapa View dengan pengaturan yang sama gunakan PropertyValuesHolder — ia menerima array nama properti dan nilai yang sesuai.
// TypeEvaluator kustom untuk kelas ProgressState
data class ProgressState(val progress: Float, val color: Int)
class ProgressEvaluator : TypeEvaluator<ProgressState> {
override fun evaluate(
fraction: Float,
startValue: ProgressState,
endValue: ProgressState
): ProgressState {
val progress = startValue.progress + fraction * (endValue.progress - startValue.progress)
val color = ArgbEvaluator().evaluate(
fraction, startValue.color, endValue.color
) as Int
return ProgressState(progress, color)
}
}
"> PropertyValuesHolder — kinerja maksimal
val pvh1 = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f)
val pvh2 = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f)
val pvhAnim = ObjectAnimator.ofPropertyValuesHolder(myView, pvh1, pvh2).apply {
duration = 300L
start()
}
Pertanyaan yang Sering Diajukan
View Animation (Tween Animation) hanya mengubah tampilan visual View melalui matrix transform, tanpa memengaruhi properti nyata objek. Setelah animasi translationX di View Animation, elemen secara visual berpindah, tetapi klik diproses di posisi asli. Property Animation (ObjectAnimator) mengubah properti nyata — setelah animasi, elemen secara fisik berada di posisi baru.
Panggil animator.cancel() — animasi berhenti segera, nilai akhir tidak diterapkan. Panggilan animator.end() — animasi beralih ke keadaan akhir dan berhenti. Untuk AnimatorSet — set.cancel() menghentikan semua animasi dalam set. Animator.pause() dan resume() tersedia di API 19+ untuk penjeda sementara.
Material Design merekomendasikan: FastOutSlowInInterpolator — untuk kemunculan dan penghilangan elemen, LinearInterpolator — untuk indikator pemuatan, OvershootInterpolator — untuk efek aksen (tombol), BounceInterpolator — untuk pull-to-refresh dan elemen pegas. Untuk animasi muncul dari tepi layar gunakan AccelerateDecelerateInterpolator.
Periksa: (1) objek memiliki setter publik untuk properti yang ditentukan (setPropertyName()), (2) properti ditulis dalam camelCase dengan huruf kecil setelah «set», (3) setter menerima tipe yang sama yang Anda berikan (ofFloat → setPropertyName(float)). Untuk View semua properti standar (alpha, translationX, rotation dll.) memiliki setter.
ObjectAnimator — ketika Anda menganimasikan satu properti standar View (alpha, translationX, rotation). ValueAnimator — ketika perlu memperbarui beberapa properti dari satu pendengar, menganimasikan properti non-View (progres, gambar kustom), atau ketika objek tidak memiliki setter untuk properti yang diinginkan. ValueAnimator lebih fleksibel, tetapi membutuhkan lebih banyak kode untuk pembaruan manual.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga