해당 포스트는 Android view가 실제 화면에 그려지는지에 대한 프로세스를 정리한 것입니다.
Android View는 화면에 그려지기 전에 아래 그림과 같은 몇 단계의 과정을 거친다.
위 단계를 크게 두가지로 나눌수 있다.
- 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
- EXACTLY (고정)
- AT_MOST (가변 및 가변의 최대값)
- 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
댓글남기기