[Android] View Measure Process

업데이트:

해당 포스트는 Android view가 실제 화면에 그려지는지에 대한 프로세스를 정리한 것입니다.

Android View는 화면에 그려지기 전에 아래 그림과 같은 몇 단계의 과정을 거친다.

process

위 단계를 크게 두가지로 나눌수 있다.

  • Layout 과정
  • Draw 과정

각 과정의 시작점은 아래와 같다.

  • Layout 과정은 requestLayout() 메서드에 의해서 시작
  • Draw 과정은 invalidate() 메서드에 의해서 시작.

Android 에서 뷰는 두 종류로 나뉜다.

  • child view 가 있는 뷰. 즉 ViewGroup
  • child view 가 없는 뷰.

Android 에서 뷰를 화면에 배치시키는 책임은 뷰를 담고 있는 뷰그룹에게 있다. 따라서 자식이 없는 뷰일 경우 Layout 과정에서 Measure 단계만 구현하는 경우가 많다.

View의 기하(Geometry)

View는 기본적으로 사각형으로 이루워져있다.

[(left, top), (right, bottom)] or [(left, top), (width, height)] 로 사각형을 정의한다.

Android에서 View는 두 종류의 width와 height를 가지고 있다.

  • Measured Width, Measured Height 는 view가 부모 view 크기의 범위 내에서 가지고 싶어하는 너비와 높이이다.
  • Drawing Width, Drawing Height 는 뷰의 실제 너비와 높이로 뷰를 그리기 위해서 사용한다. 안드로이드에서는 이 Drawing Width와 Drawing Height를 width와 height로 표기한다.
  • 따라서 Measured Width, Measured Height 는 Drawing Width, Drawing Height 와 다를 수 있다. 왜냐하면 뷰의 패딩, 마진 등을 고려하면 원하는 크기에서 패딩 및 마진 값을 빼야 하기 때문이다.

Layout 과정

Layout 과정은 Top-Down 방식이다. 즉 부모부터 과정이 시작되고 자식으로 전파된다. 따라서 Layout 과정에서 부모뷰의 크기가 결정되고 나서 자식뷰의 Layout 과정이 시작된다.
부모 뷰의 Measure Spec Mode 에 따라서 자식의 Layout 과정을 달리 해야 한다.

Measure Spec Mode

  1. EXACTLY (고정)
  2. AT_MOST (가변 및 가변의 최대값)
  3. UNSPECIFIED (정해지지 않음. Layout 과정 재발생.)

뷰의 너비와 높이는 둘 중 하나이다.

  • 고정값이다. (EXACTLY) : match_parent 또는 70dp 와 같은 수치, match_parent 가 고정값인 이유는 Layout 과정이 Top-Down으로 일어나므로 자식뷰의 Layout 과정에서는 이미 부모 뷰의 크기가 정해진 고정값과 같다.
  • 가변적이다. (AT_MOST) : wrap_content

부모뷰가 EXACTLY 일 경우

자식뷰레이아웃 뷰모드 크기 설명
정확한 수치 크기(ex. 50dp) EXACTLY childSize 자식뷰는 특정 크기를 원한다.
MATCH_PARENT EXACTLY parentContentSize 자식뷰는 부모와 같은 크기를 원한다.
WRAP_CONTENT AT_MOST parentContentSize 자식뷰는 자신이 크기를 결정하기를 원한다. 즉 parentContentSize 가 최대값이다.

부모뷰가 AT_MOST 일 경우

자식뷰레이아웃 뷰모드 크기 설명
정확한 수치 크기 EXACTLY childSize 자식뷰는 특정 크기를 원한다.
MATCH_PARENT AT_MOST parentContentSize 자식뷰는 부모와 같은 크기를 원한다. 하지만 아직 크기가 고정되지 않았다. 단 부모보다 크지 않게 제한한다.
WRAP_CONTENT AT_MOST parentContentSi ze 자식뷰는 자신이 크기를 결정하기를 원한다. 단 부모뷰의 크기보다 클 수는 없다. 즉 parentContentSize 가 최대값이다.

부모뷰가 UNSPECIFIED 일 경우

자식뷰레이아웃 뷰모드 크기 설명
정확한 수치 크기 EXACTLY childSize 자식뷰는 특정 크기를 원한다.
MATCH_PARENT UNSPECIFIED 아직 정해지지 않았다. 자식뷰는 부모와 같은 크기를 원한다. 자식뷰는 나중에 자신의 크기를 정할 수 있다.
WRAP_CONTENT UNSPECIFIED 아직 정해지지 않았다. 자식뷰는 자신이 크기를 결정하기를 원한다. 자식뷰는 나중에 자신의 크기를 정할 수 있다.

Reference

  • http://m.blog.daum.net/creazier/15310524

태그:

카테고리:

업데이트:

댓글남기기