onMeasure()
- це ваша можливість сказати Android, наскільки великим ви хочете, щоб ваш власний вигляд залежав від обмежень щодо макета, передбачених батьком; це також можливість вашого власного перегляду дізнатися, що таке обмеження компонування (якщо ви хочете поводитись інакше в match_parent
ситуації, ніж у wrap_content
ситуації). Ці обмеження пакуються в MeasureSpec
значення, передані методу. Ось приблизна кореляція значень режиму:
- ТОЧНО означає, що
layout_width
або layout_height
значення було встановлено на певне значення. Ви, ймовірно, повинні зробити ваш погляд такого розміру. Це також може спрацьовувати, коли match_parent
використовується, щоб точно встановити розмір батьківського подання (це макет залежить від рамки).
- AT_MOST зазвичай означає, що значення
layout_width
або layout_height
встановлено на match_parent
або, wrap_content
де потрібен максимальний розмір (це макет залежить від рамки), а розмір батьківського виміру - це значення. Ви не повинні бути більшими за цей розмір.
- UNSPECIFIED зазвичай означає, що значення
layout_width
або layout_height
встановлено wrap_content
без обмежень. Ви можете бути будь-якого розміру, який хочете. Деякі макети також використовують цей зворотний дзвінок, щоб визначити потрібний розмір, перш ніж визначити, які саме характеристики насправді передадуть вам у запиті другої міри.
Договір, який існує, onMeasure()
полягає в тому, що setMeasuredDimension()
ОБОВ'ЯЗКОВО зателефонувати в кінці того розміру, який ви хотіли б мати. Цей метод викликається всіма реалізаціями фреймворку, включаючи реалізацію за замовчуванням View
, яку ви знайдете, і тому super
замість цього безпечно дзвонити, якщо це відповідає вашому випадку використання.
Зрозуміло, оскільки рамка застосовує реалізацію за замовчуванням, можливо, вам не знадобиться перекривати цей метод, але ви можете відрізати в тих випадках, коли простір перегляду менший, ніж ваш вміст, якщо цього немає, і якщо ви викладете свій спеціального перегляду wrap_content
в обох напрямках, ваш погляд може взагалі не відображатися, оскільки рамка не знає, наскільки вона велика!
Як правило, якщо ви переважаєте, View
а не інший існуючий віджет, напевно, це хороша ідея, щоб забезпечити його реалізацію, навіть якщо це так просто, як щось подібне:
@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);
}
Сподіваюся, що це допомагає.