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.

lgfischer.dll
sumber
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.

Prakash Nadar
sumber
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