Bagaimana Anda menganimasikan perubahan warna latar belakang tampilan di Android?
Sebagai contoh:
Saya memiliki pandangan dengan warna latar belakang merah. Warna latar belakang tampilan berubah menjadi biru. Bagaimana saya bisa melakukan transisi yang mulus antar warna?
Jika ini tidak dapat dilakukan dengan tampilan, sebuah alternatif akan diterima.
android
animation
view
background-color
hpique
sumber
sumber
Jawaban:
Saya akhirnya mencari solusi (cukup bagus) untuk masalah ini!
Anda dapat menggunakan TransitionDrawable untuk mencapai ini. Misalnya, dalam file XML di folder yang dapat digambar Anda dapat menulis sesuatu seperti:
Kemudian, dalam XML untuk Tampilan aktual Anda akan mereferensikan TransitionDrawable ini dalam
android:background
atribut.Pada titik ini Anda dapat memulai transisi pada kode Anda saat diminta dengan melakukan:
Atau jalankan transisi secara terbalik dengan menelepon:
Lihat jawaban Roman untuk solusi lain menggunakan API Animasi Properti, yang tidak tersedia pada saat jawaban ini awalnya diposting.
sumber
Anda dapat menggunakan Api Animasi Properti baru untuk animasi warna:
Untuk kompatibilitas dengan Android 2.x gunakan perpustakaan Old Nine Androids dari Jake Wharton.
The
getColor
Metode ini usang dalam Android M, sehingga Anda memiliki dua pilihan:Jika Anda menggunakan perpustakaan dukungan, Anda perlu mengganti
getColor
panggilan dengan:jika Anda tidak menggunakan perpustakaan dukungan, Anda perlu mengganti
getColor
panggilan dengan:sumber
ValueAnimator.ofArgb(colorFrom, colorTo)
terlihat lebih to the point, tapi sayangnya itu baru.Tergantung pada bagaimana tampilan Anda mendapatkan warna latar belakang dan bagaimana Anda mendapatkan warna target Anda ada beberapa cara berbeda untuk melakukan ini.
Dua yang pertama menggunakan kerangka Animasi Properti Android .
Gunakan Obyek Animator jika:
argb
nilai dalam file xml.view.setBackgroundColor()
Objek animator bekerja dengan memanggil
view.setBackgroundColor
yang menggantikan drawable yang didefinisikan kecuali apakah itu instance dari aColorDrawable
, yang jarang ada. Ini berarti bahwa setiap properti latar belakang tambahan dari stroke atau sudut yang dapat digambar akan dihapus.Gunakan Animator Nilai jika:
Gunakan gambar Transisi jika:
Saya telah mengalami beberapa masalah kinerja dengan drawables Transition yang berjalan saat saya membuka DrawerLayout yang belum bisa saya selesaikan, jadi jika Anda menemukan kegagapan yang tidak terduga, Anda mungkin mengalami bug yang sama seperti saya.
Anda harus mengubah contoh Value Animator jika Anda ingin menggunakan drawable StateLists atau LayerLists drawable , jika tidak maka ia akan crash pada
final GradientDrawable background = (GradientDrawable) view.getBackground();
baris.Obyek Animator :
Lihat definisi:
Buat dan gunakan yang
ObjectAnimator
seperti ini.Anda juga dapat memuat definisi animasi dari xml menggunakan AnimatorInflater seperti XMight di objek AndroidAnimator menghidupkan latar belakangWarna Layout
Nilai Animator :
Lihat definisi:
Definisi yang dapat digambar:
Buat dan gunakan ValueAnimator seperti ini:
Dapat ditarik transisi :
Lihat definisi:
Definisi yang dapat digambar:
Gunakan TransitionDrawable seperti ini:
Anda dapat membalikkan animasi dengan memanggil
.reverse()
instance animasi.Ada beberapa cara lain untuk melakukan animasi tetapi ketiganya mungkin yang paling umum. Saya biasanya menggunakan ValueAnimator.
sumber
Anda dapat membuat animator objek. Misalnya, saya memiliki targetView dan saya ingin mengubah warna latar belakang Anda:
sumber
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Implementasinya adilofInt(...).setEvaluator(new ArgbEvaluator())
.Jika Anda ingin animasi warna seperti ini,
kode ini akan membantu Anda:
sumber
anim.setRepeatCount(ValueAnimator.INFINITE);
bukan Animasi. INFINITE untuk saat ini sama, tapi kami tidak punya jaminanCara terbaik adalah dengan menggunakan ValueAnimator dan
ColorUtils.blendARGB
sumber
Cara mudah lain untuk mencapai ini adalah dengan melakukan fade menggunakan AlphaAnimation.
sumber
Ini adalah metode yang saya gunakan dalam Aktivitas Dasar untuk mengubah latar belakang. Saya menggunakan GradientDrawables yang dihasilkan dalam kode, tetapi dapat disesuaikan dengan kebutuhan.
pembaruan: Jika ada yang mengalami masalah yang sama dengan yang saya temukan, untuk beberapa alasan di Android <4.3 menggunakan
setCrossFadeEnabled(true)
menyebabkan efek white out yang tidak diinginkan jadi saya harus beralih ke warna solid untuk <4.3 menggunakan metode @Roman Minenok ValueAnimator yang disebutkan di atas.sumber
Jawaban diberikan dalam banyak cara. Anda juga dapat menggunakan
ofArgb(startColor,endColor)
dariValueAnimator
.untuk API> 21:
sumber
Dokumentasi tentang animasi bertenaga XML mengerikan. Saya telah mencari sekitar jam hanya untuk menghidupkan warna latar belakang tombol ketika menekan ... Yang menyedihkan adalah bahwa animasi hanya satu atribut jauhnya: Anda dapat menggunakan
exitFadeDuration
diselector
:Kemudian gunakan saja
background
untuk tampilan Anda. Tidak diperlukan kode Java / Kotlin.sumber
android:enterFadeDuration
; pengalaman saya adalah bahwa, tanpa itu, animasi saya tidak berfungsi untuk kedua kalinya.Berikut adalah fungsi bagus yang memungkinkan ini:
Dan di Kotlin:
sumber
tambahkan folder animator ke folder res . (nama harus animator ). Tambahkan file sumber daya animator. Misalnya res / animator / fade.xml
Di dalam file java Activity, panggil ini
sumber
Gunakan fungsi di bawah ini untuk Kotlin:
Lewati tampilan apa pun yang Anda ingin ubah warnanya.
sumber
Saya telah menemukan bahwa implementasi yang digunakan oleh
ArgbEvaluator
dalam kode sumber Android melakukan pekerjaan terbaik dalam transisi warna. Saat menggunakan HSV, tergantung pada dua warna, transisi melompati terlalu banyak warna untuk saya. Tetapi metode ini tidak.Jika Anda mencoba menghidupkan, gunakan
ArgbEvaluator
denganValueAnimator
seperti yang disarankan di sini :Namun, jika Anda seperti saya dan ingin mengikat transisi Anda dengan beberapa isyarat pengguna atau nilai lain yang diteruskan dari input,
ValueAnimator
itu tidak banyak membantu (kecuali Anda menargetkan untuk API 22 dan di atas, dalam hal ini Anda dapat menggunakanValueAnimator.setCurrentFraction()
metode ini ). Saat menargetkan di bawah API 22, bungkus kode yang ditemukan dalamArgbEvaluator
kode sumber dalam metode Anda sendiri, seperti yang ditunjukkan di bawah ini:Dan gunakan sesuka Anda.
sumber
Berdasarkan jawaban ademar111190 , saya telah membuat metode ini yang akan mengirimkan warna latar belakang tampilan antara dua warna:
sumber