AOS

onMeasure/onLayout

asu2880 2020. 3. 23. 14:41

ViewGroup을 사용하여 태그형식의 레이아웃을 만든다.

화면 구성하는 2가지의 과정을 수행하게 된다.

안드로이드에서 제공하는 뷰를 상속받아 커스텀 뷰를 만들 때는 뷰가 그려진다.

1. onMeasure, 2. onLayout

순으로 실행하게 된다.

onMeasure() : 뷰의 크기를 정함

onDraw() : 뷰를 그림

 

onMeasure()

View 는 layout 안에서 너비(width) 나 높이(height) 가 각 View 마다 자신의 값을 가질 수 있다.

그래서 View 는 자신의 width 와 height 의 값을 가지고 있다.

이것이 member variable 인 mMeasuredWidth / mMeasuredHeight 이다.

그래서, 기본적으로 이 mMeasuredWidth / mMeasuredHeight 이 set 돼야 한다.

onMeasure() 의 파라미터는 int widthMeasureSpec, int heightMeasureSpec로 구성 되어 있다.

  • widthMeasureSpec : 부모컨테이너에서 정한 가로, 
  • heightMeasureSpec : 부모컨테이너에서 정한 세로 (View.MeasureSpec 의 값) 을 사용한다.

부모노드에서 자식노드를 경유하며 실행되며, 뷰의 크기를 알아내기 위해 호출된다.

이것은 뷰의 크기를 측정하는 것은 아니며 실제 크기 측정은 onMeasure(int, int)를 통해 이뤄진다. 

measure(int, int)의 내부에서는 onMeasure(int, int)를 호출함으로써 뷰의 크기를 알아낸다.

이 크기 값으로 onDraw()에서 그려지게 된다.

 

onLayout()

부모노드에서 자식노드를 경유하며 실행되며, 뷰와 자식뷰들의 크기와 위치를 할당할 때 사용된다.

measure(int, int)에 의해 각 뷰에 저장된 크기를 사용하여 위치를 지정한다.

내부적으로 onLayout()를 호출하고 onLayout()에서 실제 뷰의 위치를 할당하는 구조로 되어있다.

주의할 점은 이 위치가 장비 디스플레이의 절대적 위치이다.

부모를 기준으로한 상대적인 위치가 아니다.

 

728x90
반응형