Di iOS, ada fasilitas yang sangat mudah dan kuat untuk menganimasikan penambahan dan penghapusan baris UITableView, inilah klip dari video youtube yang menunjukkan animasi default. Perhatikan bagaimana baris di sekitarnya runtuh ke baris yang dihapus. Animasi ini membantu pengguna melacak apa yang berubah dalam daftar dan di mana dalam daftar yang mereka lihat ketika data berubah.
Karena saya telah mengembangkan di Android, saya tidak menemukan fasilitas yang setara untuk menghidupkan setiap baris di TableView . Memanggil notifyDataSetChanged()
Adaptor saya menyebabkan ListView segera memperbarui kontennya dengan informasi baru. Saya ingin menunjukkan animasi sederhana dari baris baru yang mendorong atau meluncur ketika data berubah, tetapi saya tidak dapat menemukan cara yang terdokumentasi untuk melakukan ini. Sepertinya LayoutAnimationController mungkin memegang kunci untuk membuat ini berfungsi, tetapi ketika saya mengatur LayoutAnimationController pada ListView saya (mirip dengan LayoutAnimation2 ApiDemo ) dan menghapus elemen dari adaptor saya setelah daftar ditampilkan, elemen-elemen menghilang segera alih-alih menjadi animasi keluar .
Saya juga sudah mencoba hal-hal seperti berikut ini untuk menghidupkan barang individual ketika dihapus:
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
Animation animation = new ScaleAnimation(1, 1, 1, 0);
animation.setDuration(100);
getListView().getChildAt(position).startAnimation(animation);
l.postDelayed(new Runnable() {
public void run() {
mStringList.remove(position);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
Namun, baris yang mengelilingi baris animasi tidak bergerak posisi sampai mereka melompat ke posisi baru ketika notifyDataSetChanged()
dipanggil. Tampaknya ListView tidak memperbarui tata letaknya setelah elemen-elemennya ditempatkan.
Saat menulis implementasi saya sendiri / garpu ListView telah terlintas di benak saya, ini sepertinya sesuatu yang seharusnya tidak terlalu sulit.
Terima kasih!
Jawaban:
untuk penggunaan animasi top-to-down:
sumber
anim.setAnimationListener(new AnimationListener() { ... })
daripada menggunakan HandlerpopulateList()
untuk?Handler
. Kedua, itu membuat kode lebih kompleks dengan sudah menggunakan panggilan balik bawaan untuk saat animasi selesai. Ketiga, Anda tidak tahu bagaimana implementasiHandler
danAnimation
akan bekerja pada setiap platform; mungkin saja runnable tertunda Anda terjadi sebelum animasi selesai.Yang
RecyclerView
mengurus menambahkan, menghapus, dan memesan ulang animasi!Ini proyek AndroidStudio sederhana fitur
RecyclerView
. lihat komit :sumber
Lihatlah solusi Google. Berikut adalah metode penghapusan saja.
Kode proyek ListViewRemovalAnimation dan demonstrasi Video
Perlu Android 4.1+ (API 16). Tapi kami punya 2014 di luar.
sumber
Karena
ListViews
sangat dioptimalkan saya pikir ini tidak mungkin untuk diterima. Sudahkah Anda mencoba membuat "ListView" Anda dengan kode (yaitu dengan menggembungkan baris Anda dari xml dan menambahkannya ke aLinearLayout
) dan menghidupkannya?sumber
LinearLayout
, namun denganLinearLayout
kinerja dataset yang sangat besar akan menjadi sangat buruk.ListView
memiliki banyak optimisasi pintar seputar daur ulang tampilan yang memungkinkannya menangani set data besar (UITableView iOS memiliki optimisasi yang sama). Menulis tampilan saya sendiri pendaur ulang berada di bawah kategoriSudahkah Anda mempertimbangkan menggerakkan sapuan ke kanan? Anda dapat melakukan sesuatu seperti menggambar bilah putih yang semakin besar di bagian atas item daftar, lalu mengeluarkannya dari daftar. Sel-sel lain masih akan menyentak ke tempatnya, tetapi lebih baik daripada tidak sama sekali.
sumber
panggil listView.scheduleLayoutAnimation (); sebelum mengubah daftar
sumber
Saya meretas bersama cara lain untuk melakukannya tanpa harus memanipulasi tampilan daftar. Sayangnya, Animasi Android biasa tampaknya memanipulasi isi baris, tetapi tidak efektif untuk benar-benar mengecilkan tampilan. Jadi, pertama-tama pertimbangkan penangan ini:
Tambahkan koleksi ini ke adaptor Daftar Anda:
dan tambahkan
Selanjutnya, di mana pun Anda ingin menyembunyikan baris, tambahkan ini:
Itu dia! Anda dapat mengubah kecepatan animasi dengan mengubah jumlah piksel yang menyusut tingginya sekaligus. Tidak benar-benar canggih, tetapi berhasil!
sumber
Setelah memasukkan baris baru ke ListView, saya hanya menggulir ListView ke posisi baru.
sumber
Saya belum mencobanya tetapi sepertinya animateLayoutChanges harus melakukan apa yang Anda cari. Saya melihatnya di kelas ImageSwitcher, saya menganggap itu di kelas ViewSwitcher juga?
sumber
Karena Android adalah open source, Anda sebenarnya tidak perlu mengimplementasikan kembali optimasi ListView. Anda dapat mengambil kode ListView dan mencoba menemukan cara untuk meretas dalam animasi, Anda juga dapat membuka permintaan fitur di pelacak bug android (dan jika Anda memutuskan untuk menerapkannya, jangan lupa untuk berkontribusi tambalan ).
FYI, kode sumber ListView ada di sini .
sumber
Berikut kode sumber untuk memungkinkan Anda menghapus baris dan menyusun ulangnya.
File demo APK juga tersedia. Menghapus baris dilakukan lebih banyak di sepanjang baris aplikasi Gmail Google yang mengungkapkan tampilan bawah setelah menggesek tampilan atas. Tampilan bawah dapat memiliki tombol Undo atau apa pun yang Anda inginkan.
sumber
Seperti yang saya telah menjelaskan pendekatan saya di situs saya, saya membagikan tautannya. Bagaimanapun idenya adalah membuat bitmap dengan getdrawingcache. Memiliki dua bitmap dan menghidupkan bitmap yang lebih rendah untuk menciptakan efek bergerak
Silakan lihat kode berikut:
Untuk memahami dengan gambar lihat ini
Terima kasih.
sumber
Saya telah melakukan sesuatu yang mirip dengan ini. Salah satu pendekatan adalah menginterpolasi dari waktu animasi, ketinggian tampilan dari waktu ke waktu di dalam baris
onMeasure
saat mengeluarkanrequestLayout()
untuk listView. Ya mungkin lebih baik dilakukan di dalam kode listView secara langsung tetapi itu adalah solusi cepat (itu terlihat bagus!)sumber
Hanya berbagi pendekatan lain:
Pertama-tama atur android tampilan daftar : animateLayoutChanges menjadi true :
Kemudian saya menggunakan handler untuk menambahkan item dan memperbarui tampilan daftar dengan penundaan:
sumber