Saya mencoba menerapkan animasi ke tampilan di aplikasi Android saya setelah aktivitas saya dibuat. Untuk melakukan ini, saya perlu menentukan ukuran tampilan saat ini, dan kemudian menyiapkan animasi untuk diskalakan dari ukuran saat ini ke ukuran baru. Bagian ini harus diselesaikan saat runtime, karena tampilan berskala ke ukuran yang berbeda bergantung pada masukan dari pengguna. Tata letak saya ditentukan dalam XML.
Ini sepertinya tugas yang mudah, dan ada banyak pertanyaan SO mengenai hal ini meskipun tidak ada yang menyelesaikan masalah saya, jelas. Jadi mungkin saya melewatkan sesuatu yang jelas. Saya memahami pandangan saya dengan:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Ini bekerja baik, tapi saat memanggil getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
, dll, mereka semua kembali 0. Saya juga mencoba secara manual menelepon measure()
pada tampilan diikuti dengan panggilan untuk getMeasuredWidth()
, tapi itu tidak berpengaruh.
Saya telah mencoba memanggil metode ini dan memeriksa objek di debugger di aktivitas saya onCreate()
dan di onPostCreate()
. Bagaimana cara mengetahui dimensi yang tepat dari tampilan ini saat runtime?
sumber
match_parent
). Dalam kasus ini, solusi sederhana yang bisa dipanggil dengan aman bahkan sebelum View digambar (misalnya, dari metode onCreate () Aktivitas Anda) adalah hanya dengan menggunakan Display.getSize (); lihat stackoverflow.com/a/30929599/5025060 untuk detailnya. Saya tahu ini bukan yang diminta @NikReiman, hanya meninggalkan catatan untuk mereka yang mungkin dapat menggunakan metode yang lebih sederhana ini.Jawaban:
Gunakan ViewTreeObserver pada Tampilan untuk menunggu tata letak pertama. Hanya setelah tata letak pertama, getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight () akan berfungsi.
sumber
removeGlobalOnLayoutListener(this);
? karena sudah usang.Sebenarnya ada beberapa solusi, bergantung pada skenarionya:
Penggunaan sampel:
Jika Anda mengetahui ukuran wadahnya:
Jika Anda menulis di Kotlin, Anda dapat menggunakan fungsi selanjutnya, yang bekerja di balik layar persis seperti
runJustBeforeBeingDrawn
yang saya tulis:Perhatikan bahwa Anda perlu menambahkan ini ke gradle (ditemukan lewat sini ):
sumber
OnPreDrawListener
. Kasus teruji ketika Anda ingin menjalankan kode dari ActivityonCreate()
dan Anda segera aplikasi latar belakang. Mudah diulang terutama pada perangkat yang lebih lambat. Jika Anda menggantiOnPreDrawListener
denganOnGlobalLayoutListener
- Anda tidak akan melihat masalah yang sama.ViewTreeObserver
ataupost
, dalam kasus saya nomor 2 membantu (view.measure
).Apakah Anda menelepon
getWidth()
sebelum tampilan ditampilkan di layar?sumber
onSizeChange()
acara untuk mengetahui ukuran sebenarnya? Itu sepertinya sedikit berlebihan ... meskipun pada titik ini saya putus asa hanya untuk mendapatkan kodenya bekerja, jadi itu layak dicoba.onPostCreate()
yang dijalankan setelah tampilan sepenuhnya dibuat dan dimulai.Berdasarkan saran @ mbaird, saya menemukan solusi yang bisa diterapkan dengan mensubkelas
ImageView
kelas dan menimpanyaonLayout()
. Saya kemudian membuat antarmuka pengamat yang diimplementasikan aktivitas saya dan meneruskan referensi ke dirinya sendiri ke kelas, yang memungkinkannya memberi tahu aktivitas ketika ukuran sebenarnya selesai.Saya tidak 100% yakin bahwa ini adalah solusi terbaik (karena itu saya belum menandai jawaban ini sebagai benar dulu), tetapi berhasil dan menurut dokumentasi adalah pertama kalinya ketika seseorang dapat menemukan ukuran sebenarnya dari sebuah tampilan.
sumber
Berikut adalah kode untuk mendapatkan tata letak melalui mengganti tampilan jika API <11 (API 11 menyertakan fitur View.OnLayoutChangedListener):
sumber
Anda dapat memeriksa pertanyaan ini . Anda dapat menggunakan metode
View
's post () .sumber
Gunakan kode di bawah ini, ini memberikan ukuran tampilan.
sumber
Ini bekerja untuk saya di
onClickListener
:sumber
Saya juga tersesat
getMeasuredWidth()
dangetMeasuredHeight()
getHeight()
dangetWidth()
untuk waktu yang lama ......... kemudian saya menemukan bahwa mendapatkan lebar dan tinggionSizeChanged()
tampilan adalah cara terbaik untuk melakukan ini ........ Anda bisa secara dinamis dapatkan lebar CURRENT dan tinggi CURRENT dari tampilan Anda dengan menggantionSizeChanged(
metode).mungkin ingin melihat ini yang memiliki cuplikan kode yang rumit. Entri Blog Baru: cara mendapatkan dimensi lebar dan tinggi dari Tampilan kustom (memperluas Tampilan) di Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
sumber
Anda bisa mendapatkan Posisi dan Dimensi tampilan di layar
sumber
bekerja sempurna untuk saya:
sumber