Apa perbedaan antara getWidth / Height () dan getMeasuredWidth / Height () di Android SDK?


91

The Android Dokumentasi mengatakan bahwa ada dua ukuran untuk tampilan, yang dimensi yang diukur dan dimensi gambar . Dimensi yang diukur adalah yang dihitung dalam langkah pengukuran ( metode onMeasure ), sedangkan dimensi gambar adalah ukuran sebenarnya di layar. Secara khusus, dokumentasinya mengatakan bahwa:

Nilai-nilai ini mungkin, tetapi tidak harus, berbeda dari lebar dan tinggi yang diukur.

Jadi, pertanyaan saya adalah: apa yang bisa membuat dimensi gambar berbeda dari dimensi yang diukur? Jika metode onMeasure (int, int) mematuhi persyaratan tata letak (diberikan sebagai parameter widthMeasureSpec dan heightMeasureSpec , bagaimana SDK dapat memutuskan bahwa tampilan harus memiliki ukuran gambar yang berbeda?

Selain itu, bagaimana / di mana dalam Kode Sumber Android lebar / tinggi yang diukur digunakan untuk menghitung lebar / tinggi gambar? Saya mencoba untuk melihat ke dalam kode sumber View , tetapi saya tidak tahu bagaimana measureWidth / Height digunakan untuk menghitung lebar / tinggi akhir. Mungkin ada hubungannya dengan bantalannya, tapi saya tidak yakin.


Saya pikir langkah-langkah ini dapat berbeda jika gulungan ditambahkan ke tampilan.
Yury

Mungkin, tapi saya mengembangkan ViewGroup kustom, dan ini terjadi di kode saya. Saya tidak berurusan dengan gulir sampai titik di mana perilaku ini terjadi. Jadi saya pikir seharusnya ada lebih dari sekedar gulungan yang terlibat dalam hal ini.
lgfischer

Saya mengonfirmasi, saya juga mengembangkan ViewGroup kustom untuk memaksakan rasio aspek tertentu: Saya memaksakan lebar dan tinggi yang diukur (lebih rendah atau sama dengan yang diusulkan), tetapi sebagai hasilnya, lebar dan tinggi sebenarnya tidak berubah (bukan yang diukur). Tidak ada hubungannya dengan gulir. Saya benar-benar tidak dapat menemukan cara untuk memaksakan lebar dan tinggi yang sebenarnya.
ARLab

Jawaban:


101

Seperti namanya, MeasurWidth / height digunakan selama fase pengukuran dan tata letak.

Izinkan saya memberi contoh,

Sebuah widget diminta untuk mengukur dirinya sendiri, Widget mengatakan bahwa ia ingin berukuran 200px kali 200px. Ini diukurLebar / tinggi.

Selama fase tata letak, yaitu dalam metode onLayout. Metode ini bisa menggunakan measureWidth / height turunannya atau menetapkan lebar / tinggi baru dengan memanggil metode layout tampilan.

katakanlah metode onLayout memanggil childview.layout (0,0,150,150) sekarang lebar / tinggi tampilan berbeda dari lebar / tinggi yang diukur.

Saya menyarankan untuk tidak menggunakan metode MeasurWidth / height di luar onLayout.

untuk meringkas .

  1. onMeasure -> menyiapkan measureWidth / measureHeight
  2. onLayout -> menyiapkan lebar / tinggi widget.

Selain itu
public void View.layout(int l, int t, int r, int b)
tampaknya menjadi tempat di mana penetapan posisi dan ukuran terjadi.


artinya, kita harus selalu menggunakan getWidth / getHeight untuk mendapatkan dimensi "nyata" dari sebuah Tampilan, bukan?
suitianshi

1
Ya, tetapi jika Anda melakukan tata letak sendiri, Anda harus menggunakan measureWidth, bukan lebar.
Prakash Nadar

Jadi, apa tujuan menyetel dimensi di dalam onMeasure ()? Maksud saya, tata letak lulus adalah yang terakhir, di mana Anda menetapkan dimensi akhir tampilan, kemungkinan terlepas dari dimensi yang diukur
edoardotognoni

@edoardotognoni bergantung pada tata letak (LinearLayout, RelativeLayout, atau tata letak kustom Anda), untuk memberikan ukuran dan posisi yang benar ke tampilan.
Prakash Nadar

Oke, katakanlah tampilan mengatakan "Saya ingin dimensi ini". Sementara tata letaknya mengatakan "Anda akan memiliki dimensi ini". Apakah tepat?
edoardotognoni
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.