onMeasure()
Android'e, özel görünümünüzün ebeveyn tarafından sağlanan düzen kısıtlamalarına ne kadar büyük olmasını istediğinizi söyleme fırsatınızdır; ayrıca özel görünümünüzün bu düzen kısıtlamalarının ne olduğunu öğrenme fırsatıdır (bir match_parent
durumda bir durumdan farklı davranmak istemeniz wrap_content
durumunda). Bu kısıtlamalar MeasureSpec
, yönteme iletilen değerlere paketlenir . İşte mod değerlerinin kabaca bir korelasyonu:
- TAMAMEN ,
layout_width
veya layout_height
değerinin belirli bir değere ayarlandığı anlamına gelir . Muhtemelen görüşünüzü bu boyutta yapmalısınız. Bu match_parent
, boyutu tam olarak üst görünüme ayarlamak için kullanıldığında da tetiklenebilir (bu, çerçeveye göre düzendir).
- AT_MOST tipik olarak,
layout_width
ya da layout_height
değeri ayarlanmıştır match_parent
ya da wrap_content
maksimum boyutu gerekli olduğu (bu düzen çerçevesinde bağlıdır), ve üst boyut boyutu değeridir. Bu boyuttan daha büyük olmamalısınız.
- BELİRTİLMEDİ, tipik olarak
layout_width
veya layout_height
değerinin wrap_content
herhangi bir kısıtlama olmadan ayarlandığı anlamına gelir . İstediğiniz boyutta olabilirsiniz. Bazı mizanpajlar da, ikinci bir ölçüm isteğinde hangi özelliklerin sizi gerçekten geçeceğini belirlemeden önce istediğiniz boyutu bulmak için bu geri aramayı kullanır.
İle var olan sözleşme onMeasure()
DİR setMeasuredDimension()
GEREKİR Eğer görünüm olmak istiyorum boyutuyla sonunda çağrılabilir. Bu yöntem, bulunan varsayılan uygulama da dahil olmak üzere tüm çerçeve uygulamaları tarafından çağrılır View
, bu nedenle super
kullanım durumunuza uyuyorsa bunun yerine aramak güvenlidir .
Çerçeve varsayılan bir uygulama uyguladığından, bu yöntemi geçersiz kılmanız gerekmeyebilir, ancak görüntüleme alanının içeriğinizden daha küçük olduğu ve kullanmıyorsanız, kırpma görebilirsiniz. wrap_content
Her iki yönde de özel görünüm ile , çerçeveniz ne kadar büyük olduğunu bilmediği için görünümünüz hiç görünmeyebilir!
Genellikle, View
başka bir mevcut widget'ı geçersiz kılıyorsanız, böyle bir şey kadar basit olsa bile, bir uygulama sağlamak muhtemelen iyi bir fikirdir:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
Umarım yardımcı olur.