Katakanlah saya memiliki linearLayout vertikal dengan:
[v1]
[v2]
Secara default v1 memiliki visibily = GONE. Saya ingin menunjukkan v1 dengan animasi yang diperluas dan menekan v2 secara bersamaan.
Saya mencoba sesuatu seperti ini:
Animation a = new Animation()
{
int initialHeight;
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final int newHeight = (int)(initialHeight * interpolatedTime);
v.getLayoutParams().height = newHeight;
v.requestLayout();
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
initialHeight = height;
}
@Override
public boolean willChangeBounds() {
return true;
}
};
Tetapi dengan solusi ini, saya memiliki berkedip ketika animasi dimulai. Saya pikir itu disebabkan oleh v1 menampilkan ukuran penuh sebelum animasi diterapkan.
Dengan javascript, ini adalah satu baris jQuery! Adakah cara sederhana untuk melakukan ini dengan android?
a.setDuration(((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density)) * 4)
v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
danv.getLayoutParams().height = interpolatedTime == 1 ? targetHeight : (int)(targetHeight * interpolatedTime);
Itu berhasil untuk saya!Saya mencoba melakukan apa yang saya yakini sebagai animasi yang sangat mirip dan menemukan solusi yang elegan. Kode ini mengasumsikan bahwa Anda selalu bergerak dari 0 -> jam atau jam -> 0 (jam adalah ketinggian maksimum). Tiga parameter konstruktor adalah view = tampilan yang akan dianimasikan (dalam kasus saya, tampilan web), targetHeight = tinggi maksimum tampilan, dan turun = boolean yang menentukan arah (true = expansion, false = collapsing).
sumber
Saya tersandung masalah yang sama hari ini dan saya kira solusi nyata untuk pertanyaan ini adalah ini
Anda harus mengatur properti ini untuk semua tata letak teratas, yang terlibat dalam shift. Jika sekarang Anda mengatur visibilitas satu tata letak ke GONE, yang lain akan mengambil ruang saat yang hilang melepaskannya. Akan ada animasi default yang merupakan semacam "fading out", tapi saya pikir Anda dapat mengubahnya - tetapi yang terakhir belum saya uji, untuk saat ini.
sumber
Saya mengambil solusi @LenaYan yang tidak berfungsi dengan baik bagi saya ( karena mengubah tampilan menjadi tampilan ketinggian 0 sebelum runtuh dan / atau meluas ) dan membuat beberapa perubahan.
Sekarang berfungsi dengan baik , dengan mengambil View ketinggian sebelumnya dan mulai berkembang dengan ukuran ini. Runtuh adalah sama.
Anda cukup menyalin dan menempelkan kode di bawah ini:
Pemakaian:
Cukup mudah!
Terima kasih LenaYan untuk kode awal!
sumber
Alternatifnya adalah menggunakan animasi skala dengan faktor penskalaan berikut untuk meluas:
dan untuk runtuh:
sumber
@ Tom jawaban Esterez , tetapi diperbarui untuk menggunakan view.measure () dengan benar per Android getMeasuredHeight mengembalikan nilai yang salah!
sumber
Ok, saya baru saja menemukan solusi yang SANGAT jelek:
Jangan ragu untuk mengusulkan solusi yang lebih baik!
sumber
View.onMeause(widthMeasureSpec, heightMeasureSpec)
invokasi, jadi spesifikasi lebar dan tinggi harus ditukar.sumber
Jika Anda tidak ingin memperluas atau menutup semua jalan - di sini adalah HeightAnimation sederhana -
Pemakaian:
sumber
Saya mengadaptasi jawaban yang saat ini diterima oleh Tom Esterez , yang berfungsi tetapi memiliki animasi yang berombak dan tidak terlalu mulus. Solusi saya pada dasarnya menggantikan
Animation
denganValueAnimator
, yang dapat dilengkapi denganInterpolator
pilihan Anda untuk mencapai berbagai efek seperti overshoot, bouncing, akselerasi, dll.Solusi ini bekerja sangat baik dengan tampilan yang memiliki ketinggian dinamis (yaitu menggunakan
WRAP_CONTENT
), karena pertama-tama mengukur ketinggian yang sebenarnya diperlukan dan kemudian menjiwai ketinggian itu.Anda kemudian cukup menelepon
expand( myView );
ataucollapse( myView );
.sumber
v.measure()
dan sekarang sudah berfungsi dengan baik. Terima kasih!Memanfaatkan Fungsi Ekstensi Kotlin ini diuji dan jawaban terpendek
Panggil saja animateVisibility (rentangkan / runtuh) pada Tampilan apa pun.
sumber
Menambahkan ke jawaban Tom Esterez yang luar biasa dan pembaruan Erik B yang sangat baik untuk itu, saya pikir saya akan memposting sendiri, memadatkan metode ekspansi dan kontrak menjadi satu. Dengan cara ini, misalnya Anda dapat melakukan tindakan seperti ini ...
... yang memanggil metode di bawah ini dan membiarkannya mengetahui apa yang harus dilakukan setelah setiap onClick () ...
sumber
Saya ingin menambahkan sesuatu ke jawaban yang sangat membantu di atas . Jika Anda tidak tahu ketinggian yang akan Anda dapatkan sejak dilihat .getHeight () menghasilkan 0, Anda dapat melakukan hal berikut untuk mendapatkan ketinggian:
Di mana DUMMY_HIGH_DIMENSIONS adalah lebar / tinggi (dalam piksel) tampilan Anda dibatasi ... memiliki jumlah yang besar ini wajar ketika tampilan dienkapsulasi dengan ScrollView.
sumber
Ini adalah cuplikan yang saya gunakan untuk mengubah ukuran lebar tampilan (LinearLayout) dengan animasi.
Kode tersebut seharusnya melakukan ekspansi atau menyusut sesuai dengan ukuran target. Jika Anda ingin lebar fill_parent, Anda harus meneruskan induk .getMeasuredWidth sebagai lebar target sambil mengatur bendera ke true.
Semoga ini bisa membantu sebagian dari Anda.
}
sumber
resizeAnim.start()
. Juga telah mencoba dengan dan tanpasetFillAfter(true)
.startAnimation(resizeAnim)
tampilan.Untuk animasi Lancar gunakan Handler dengan menjalankan metode ..... Dan Nikmati Expand / Ciutkan animasi
Dan Panggil menggunakan kode ini:
Solusi lain adalah:
sumber
solusi gabungan dari @Tom Esterez dan @Geraldo Neto
sumber
Ya, saya setuju dengan komentar di atas. Dan memang, sepertinya hal yang benar (atau setidaknya yang termudah?) Lakukan adalah menentukan (dalam XML) ketinggian tata letak awal "0px" - dan kemudian Anda dapat menyampaikan argumen lain untuk "toHeight" ( yaitu "ketinggian akhir") ke konstruktor sub-kelas Animasi khusus Anda, mis. dalam contoh di atas, akan terlihat seperti:
Bagaimanapun, harapan itu membantu! :)
sumber
Ini solusinya. Saya pikir ini lebih sederhana. Ini hanya memperluas tampilan tetapi dapat dengan mudah diperluas.
sumber
Saya pikir solusi termudah adalah mengatur
android:animateLayoutChanges="true"
ke AndaLinearLayout
dan kemudian hanya menampilkan / menyembunyikan tampilan dengan mengatur visibilitasnya. Bekerja seperti pesona, tetapi Anda tidak memiliki kendali atas durasi animasisumber
Anda berada di jalur yang benar. Pastikan Anda telah mengatur v1 untuk memiliki ketinggian tata letak nol tepat sebelum animasi dimulai. Anda ingin menginisialisasi pengaturan Anda agar terlihat seperti bingkai pertama animasi sebelum memulai animasi.
sumber
Ini adalah solusi saya, saya
ImageView
tumbuh dari100%
ke200%
dan kembali ke ukuran aslinya, menggunakan dua file animasi di dalamres/anim/
folderanim_grow.xml
anim_shrink.xml
Kirim
ImageView
ke metode sayasetAnimationGrowShrink()
setAnimationGrowShrink()
metode:sumber
Ini adalah solusi yang tepat, saya telah mengujinya:
Exapnd:
Jatuh:
Nilai Animator:
Tampilan v adalah tampilan yang akan dianimasikan, PARENT_VIEW adalah tampilan wadah yang berisi tampilan.
sumber
Ini sangat sederhana dengan droidQuery . Untuk memulai, pertimbangkan tata letak ini:
Kami dapat menganimasikan ketinggian ke nilai yang diinginkan - katakan
100dp
- menggunakan kode berikut:Kemudian gunakan
droidQuery
untuk menghidupkan. Cara paling sederhana adalah dengan ini:Untuk membuat animasi lebih menarik, pertimbangkan untuk menambahkan pelonggaran:
Anda juga dapat mengubah durasi
AnimationOptions
penggunaanduration()
metode, atau menangani apa yang terjadi ketika animasi berakhir. Untuk contoh yang kompleks, cobalah:sumber
Solusi terbaik untuk memperluas / menutup tampilan:
sumber
onCheckedChanged
.Anda dapat menggunakan ViewPropertyAnimator dengan sedikit sentuhan. Untuk menutup, skala tampilan hingga ketinggian 1 piksel, lalu sembunyikan. Untuk mengembang, perlihatkan, lalu kembangkan hingga ketinggiannya.
Pivot memberi tahu tampilan dari mana skala, default ada di tengah. Durasi adalah opsional (standar = 1000). Anda juga dapat mengatur interpolator untuk digunakan, seperti
.setInterpolator(new AccelerateDecelerateInterpolator())
sumber
Saya membuat versi di mana Anda tidak perlu menentukan ketinggian tata letak, karena itu jauh lebih mudah dan bersih untuk digunakan. Solusinya adalah mendapatkan ketinggian di frame pertama animasi (tersedia pada saat itu, setidaknya selama tes saya). Dengan cara ini Anda bisa memberikan Tampilan dengan ketinggian dan margin bawah sewenang-wenang.
Ada juga satu retasan kecil di konstruktor - margin bawah diatur ke -10000 sehingga tampilan tetap tersembunyi sebelum transformasi (mencegah flicker).
sumber
Gunakan ValueAnimator:
sumber
mainView.getLayoutParams().height = height
.sumber
Kelas dapat dipanggil dengan cara berikut
sumber
Didasarkan pada solusi oleh @ Tom Esterez dan @Seth Nelson (2 teratas) saya menyimulasikannya. Seperti halnya solusi orisinal, itu tidak bergantung pada opsi Pengembang (pengaturan animasi).
sumber