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);
}
Сподіваюся, що це допомагає.