onMeasure 메소드를 호출하는 경우 Android의 onMeasure 메소드
안녕하세요!
개발 중에 Android 기본 컨트롤이 우리의 요구 사항을 충족할 수 없는 경우 보기를 맞춤설정해야 합니다. 뷰는 먼저 측정(계산)과 레이아웃(레이아웃)을 거쳐 화면에 그려집니다.
onMeasure 메소드는 언제 호출됩니까?
하위 뷰의 상위 컨트롤이 뷰를 배치하려고 할 때 상위 컨트롤은 두 개의 매개변수(widthMeasureSpec 및 heightMeasureSpec)를 뷰에 전달합니다. 이 두 매개변수는 View가 얻을 수 있는 너비와 높이 크기 및 모드 혼합 int 데이터입니다. int mode = MeasureSpec.getMode(widthMeasureSpec)를 사용하여 모드를 얻을 수 있고 int size = MeasureSpec.getSize(widthMeasureSpec)를 사용하여 크기를 얻을 수 있습니다.
모드***에는
MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY 및 MeasureSpec.AT_MOST의 세 가지 상황이 있습니다.
MeasureSpec.EXACTLY는 컨트롤의 레이아웃_폭 또는 레이아웃_높이를
andorid:layout_width="50dip" 또는 FILL_PARENT와 같은 특정 숫자로 지정하는 경우입니다. 둘 다 컨트롤의 크기가 결정되면 정확한 크기입니다.
MeasureSpec.AT_MOST는 컨트롤의 레이아웃_너비 또는 높이를 WRAP_CONTENT로 지정한 경우 일반적으로 컨트롤의 하위 공간이나 내용에 따라 컨트롤의 크기가 변경됩니다. 컨트롤의 크기는 상위 컨트롤에서 허용하는 제한을 초과하지 않습니다. 따라서 이때의 모드는 AT_MOST이며, size는 상위 컨트롤에서 허용하는 최대 크기를 의미합니다.
MeasureSpec.UNSPECIFIED는 크기가 지정되지 않았음을 의미합니다. 일반적으로 상위 컨트롤은 AdapterView이고 모드는 측정 메서드를 통해 전달됩니다.
setMeasuredDimenson 메소드를 호출하고, 뷰의 높이와 너비를 전달하고, 하위 뷰의 실제 크기를 설정하고, 하위 뷰를 배치하는 데 필요한 공간을 상위 컨트롤에 알릴 수 있습니다.
다음은 프레임워크에서 View의 onMeasure를 구현하는 일반적인 방법입니다.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
@Override p>
intmeasureHeight =measureHeight(heightMeasureSpec);
intmeasureWidth =measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight,measureWidth);
비공개 int MeasureHeight( int MeasureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// 제한이 지정되지 않은 경우 기본 크기.
int result = 500;
if (specMode == MeasureSpec.AT_MOST) {
// 이상적인 크기 계산 이 최대 크기 내에서 컨트롤을
// 컨트롤하세요.
// 컨트롤이 사용 가능한 공간을 채우면
// 외부 경계를 반환합니다.
result = specSize;
} else if (specMode == MeasureSpec.EXACTLY) {
// 컨트롤이 이 범위 내에 들어갈 수 있으면 다음을 반환하세요.
// 값.
result = specSize;
결과 반환;
private int MeasureWidth(int MeasureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// 제한이 지정되지 않은 경우 기본 크기.
int result = 500;
if (specMode == MeasureSpec.AT_MOST) {
// 이 범위 내에서 컨트롤의 이상적인 크기를 계산하세요.
// 최대 크기
// 컨트롤이 사용 가능한 공간을 채우면
// 외부를 반환합니다.
bound.
result = specSize;
else if (specMode == MeasureSpec.EXACTLY) {
// 컨트롤이 이 범위 내에 들어갈 수 있으면 다음을 반환합니다.
// 값.
result = specSize;
결과 반환
}