onMeasure 메서드는 위젯의 크기를 결정하는 메서드로 View를 상속받아 오버라이딩 할 수 있음.

 

부모 레이아웃이 차일드를 배치하기 위해 각 차일드의 크리를 조사하는데 이때 차일드의 measure 메서드를 호출 함.  childView.measure(widthSpec, heightSpec)메서드는 강제 레이아웃, 크기 변경 빈도 최소화, 치명적인 에러 처리등의 중요한 역할을 담당하므로 위젯의 크기를 재정의 하는 것은 바람직하지 않음. 대신 measure는 크기 결정시 onMeasure를 호출하도록 되어 있으므로 onMeasure에서 위젯의 크기를 결정해야 함.

 

void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

 

인수로 전달 된 *Spec 는 부모 레이아웃이 차일드에게 제공하는 여유 공간의 폭과 높이에 대한 정보이며 공간의 성질을 지정하는 모드(Spec의 상위 2비트)와 공간의 크기값(나머지 하위 30비트)이 저장되어 하나의 정수로 묶여 전달 됨

 

Spec의 두 값을 추출하거나 다시 합칠때는 View.MeasureSpec 클래스의 아래 메서드를 사용함.

 

int geMode(int measureSpec)

int getSize(int measureSpec)

int makeMeasureSpec(int size, int mode)

 

Mode(전달되는 크기에 따라 의미가 달라짐)

 모드

설명 

 AT_MOST

차일드가 가질 수 있는 최대 크기. 이 크기 이하로 지정해야함.

 EXACTLY

차일드가 가져야할 정확한 크기. 특별한 사유가 없는한 이 크기를 가져야함.

 UNSPECIFIED

 별다른 제한이 없음. 원하는 크기를 저장함.

 

onMeasure에서 부모 레이아웃으로 차일드가 원하는 크기를 다음 메서드로 리턴 해야함.

 

void setMeasuredDimension (int measureWidth, int measureHeight)

 

두 인수는 차일드가 원하는 폭과 높이임. onMeasure 메서드가 두 값을 동시에 리턴 할 수 없기 때문에

onMeasure는 형식으로 리턴값이 없는 void 형식으로 선언되어 있지만 실제로는 setMeasuredDimension 메서드를 통해 두개의 값을 리턴해야 함. 만약 이 메서드를 호출하지 않고 그냥 리턴해 버리면 부모 레이아웃에서 IllegalStateException 예외를 일으킴.

 

형식

 

void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// Todo: 크기 및 종횡비...

 

// 원하는 크기 요청

setMeasuredDimension(Width, Height);

}

 

'Android > Class' 카테고리의 다른 글

[Android] Nested RecyclerView 만들기  (0) 2015.12.17
WeakReference & SoftReference  (0) 2015.11.20
[DecimalFormat] 숫자 자릿수 나타내기  (0) 2015.10.23
[RelativeLayout]  (0) 2015.10.21
[RecyclerView]  (0) 2015.09.18
Posted by 소망아기
: