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_parentdurumda bir durumdan farklı davranmak istemeniz wrap_contentdurumunda). Bu kısıtlamalar MeasureSpec, yönteme iletilen değerlere paketlenir . İşte mod değerlerinin kabaca bir korelasyonu:
- TAMAMEN ,
layout_widthveya layout_heightdeğ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_widthya da layout_heightdeğeri ayarlanmıştır match_parentya da wrap_contentmaksimum 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_widthveya layout_heightdeğerinin wrap_contentherhangi 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 superkullanı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_contentHer 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, Viewbaş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.