IT Study/Android

[Android] View 그려지는 과정 (뷰가 그려지는 순서)

three kim 2024. 1. 20. 16:08
728x90

안녕하세요. 이번 글에서는 View가 그려지는 과정에 대해 다뤄보려고 합니다.

 

출처 : 35개 프로젝트로 배우는 Android 앱 개발 feat.Jetpack Compose (Chapter0)

 

안드로이드에서 View는 전위순회 (부모 → 자식 순으로, 위 → 아래, 왼쪽 → 오른쪽) 방식으로 그려집니다.

 

이렇게 전위순회 방식으로 그려지는 View는

depth가 깊어질수록 확인해야 할 내용이 많아지므로 안드로이드는 flat한 구조로 작성하는 것이 좋습니다.

 

View가 그려지는 순서를 보도록 하겠습니다.

 

1. measure

모든 뷰는 자신의 width, height (크기)를 계산합니다.

measure(측정) 과정에서는 부모 - 자식 간의 뷰 크기에 대한 정보를 전달하기 위해 2가지 클래스를 사용하는데요.

ViewGroup.LayoutParams 자식 View가 부모 View에 알리는 내용 (자신이 어떻게 측정되고, 위치를 정할지 요청 시)
dp, px               (나는 특정 크기로 사이즈를 정할거예요.)
match_parent (나는 부모 사이즈와 같이 정할거예요.)
wrap_content  (나는 내 content만큼 fit한 사이즈로 정할거예요.)
ViewGroup.MeasureSpages 부모 View가 자식 View에 알리는 내용
unspecified (자식이 원하는대로 사이즈를 결정해라.)
exactly         (내가 자식의 정확한 사이즈를 정하겠다.)
at_most       (자식 뷰의 최대 사이즈는 이 정도까지만 가능하다.)

 

 

2. layout

뷰의 크기와 위치를 할당합니다. 부모를 기준으로 상대적인 위치를 계산할 수 있습니다.

 

 

3. draw

뷰를 그리는 단계입니다. Canvas에서는 뷰의 모양을 그리며, Paint를 통해 뷰의 색상을 칠할 수 있습니다.

draw 단계에서는 measure에서 측정한 크기로, layout에서 계산한 위치에 뷰를 그립니다.

draw에 대한 콜백은 언제든지 다시 호출할 수 있는데, scroll하거나 swipe하게 된다면 뷰는 onDraw를 다시 호출합니다.

 

 

4. ViewUpdate

런타임에 뷰를 다시 그리게 하는 함수입니다.

invalidate View에 변화가 생겨 다시 그려야 할 경우 (color 변화 등)
requestLayout View를 처음부터 다시 그려야 할 경우 (크기가 변화해서 measure부터 다시 진행해야 할 경우 등)