Android SDK'da getWidth / Height () ve getMeasuredWidth / Height () arasındaki fark nedir?


91

Android Belgeleri der bir görünüm için, iki boy olduğu ölçülen boyutları ve çekme boyutları . Ölçülen boyut, ölçü geçişinde hesaplanan boyuttur ( onMeasure yöntemi), çizim boyutları ise ekrandaki gerçek boyuttur. Belgeler özellikle şunları söylüyor:

Bu değerler, ölçülen genişlik ve yükseklikten farklı olabilir, ancak zorunlu değildir.

Öyleyse sorum şu: Çizim boyutunu ölçülen boyuttan farklı kılan ne olabilir? Eğer onMeasure (int, int) yöntemi bakımdan parametreleri olarak verilen düzen gereksinimleri ( widthMeasureSpec ve heightMeasureSpec SDK karar nasıl olabilir görünümü farklı bir çizim boyutu olması gerektiğini?

Ek olarak, Android Kaynak Kodunda ölçülen genişlik / yükseklik çizim genişliğini / yüksekliğini hesaplamak için nasıl / nerede kullanılır? Ben içine bakmak için uğraş Görünüm kaynak kodu , ama measuredWidth / Yükseklik nihai genişlik / yükseklik hesaplamak için nasıl kullanıldığını anlamaya olamaz. Belki dolgu ile bir ilgisi vardır, ama emin değilim.


Görünüme bir kaydırma eklendiğinde bu ölçülerin farklı olabileceğini düşünüyorum.
Yury

Belki, ancak özel bir ViewGroup geliştirdim ve bu kodumda oluyor. Bu davranışın meydana geldiği noktaya kadar kaydırma ile uğraşmıyorum. Bu yüzden bence buna parşömenden daha fazlası dahil edilmelidir.
lgfischer

Onaylıyorum, belirli bir en-boy oranını zorlamak için özel bir ViewGroup da geliştiriyorum: Ölçülen genişliği ve yüksekliği zorladım (önerilenden daha düşük veya eşit), ancak sonuç olarak gerçek genişlik ve yükseklik değişmedi (ölçülenleri değil). Kaydırma ile ilişki yok. Gerçek genişliği ve yüksekliği zorlamanın bir yolunu gerçekten bulamıyorum.
ARLabs

Yanıtlar:


101

Adından da anlaşılacağı gibi, ölçülen Genişlik / yükseklik, ölçüm ve yerleştirme aşamasında kullanılır.

Bir örnek vereyim

Bir parçacığın kendisini ölçmesi istenir, parçacık 200 piksele 200 piksel olmak istediğini söyler. Bu ölçülür Genişlik / yükseklik.

Düzen aşaması sırasında, yani onLayout yönteminde. Yöntem, alt öğelerinin ölçülen Genişliğini / yüksekliğini kullanabilir veya görünümün düzen yöntemini çağırarak yeni bir genişlik / yükseklik atayabilir.

diyelim ki onLayout yöntemi childview.layout (0,0,150,150) çağırıyor şimdi görünümün genişliği / yüksekliği ölçülen genişlik / yükseklikten farklı.

Ölçülen Genişlik / yükseklik onLayout yönteminin dışında kullanılmamasını öneririm.

özetlemek .

  1. onMeasure -> ölçülenGenişliği / ölçülenYüksekliği ayarlar
  2. onLayout -> widget'ın genişliğini / yüksekliğini ayarlar.

ayrıca
public void View.layout(int l, int t, int r, int b)
konum ve boyut atamasının gerçekleştiği yer gibi görünüyor.


yani, bir Görünümün "gerçek" boyutunu elde etmek için her zaman getWidth / getHeight kullanmalıyız, değil mi?
suitianshi

1
Evet, ancak kendi düzeninizi yapıyorsanız, genişlik yerine ölçülen Genişliği kullanmalısınız.
Prakash Nadar

Öyleyse, onMeasure () içinde boyut ayarlamanın amacı nedir? Demek istediğim, düzen geçişi, ölçülen boyutlardan bağımsız olarak olasılıkla görünümün son boyutlarını belirlediğiniz son
geçiştir

@edoardotognoni, görünüme doğru boyutu ve konumu vermek için düzene (LinearLayout, RelativeLayout veya sizin özel düzeniniz) bağlıdır.
Prakash Nadar

Tamam diyelim ki görünüm "Bu boyutları isterim" diyor. Düzen "Bu boyutlara sahip olacaksınız" derken. Doğru mu?
edoardotognoni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.