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()
IS 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);
}
도움이 되길 바랍니다.