안녕하세요.
이번 포스팅에서는 안드로이드에서 뷰가 그려지는 과정에 대해 포스팅해보겠습니다.
액티비티가 포커스를 얻게 될때 레이아웃을 그리게 요청하는데요.
뷰가 그려지는 건 레이아웃 트리의 루트노드 부터 시작하게 됩니다.
레이아웃 트리는 말그대로 레이아웃에 있는 뷰그룹이나 뷰들을 트리형태로 나타난건데
예를 들면
이런 구조로 되어 있다면
이를 오른쪽 처럼 전위순회 하면서 그려지는 방식입니다.
레이아웃을 그리는 과정은 측정패스(Measure Pass)와 레이아웃패스(Layout Pass)의 가 있습니다.
Measure Pass는 onMeasure 메소드를 호출하는데 뷰의 크기를 결정하기 위한 메소드 입니다.
Layout Pass는 onLayout메소드를 호출하는데 뷰의 위치를 결정하기 위해 호출되는 메소드 입니다.
만약 저 위 상태의 레이아웃 호출되는 순서를 보면 오른쪽 표처럼 전위순회하면서
onMeasure 메소드를 호출하고
이후
루트노드부터 다시 onLayout메소드를 호출합니다.
그리고 onDraw 메소드를 호출하여 뷰를 그리게 됩니다.
이에 대한 결과를 보면
D/TAG: MyLinearLayoutR : onMeasure
D/TAG: MyLinearLayout1 : onMeasure
D/TAG: MyTextView1 : onMeasure
D/TAG: MyTextView2 : onMeasure
D/TAG: MyLinearLayout2 : onMeasure
D/TAG: MyTextView3 : onMeasure
D/TAG: MyTextView4 : onMeasure
D/TAG: MyLinearLayoutR : onMeasure
D/TAG: MyLinearLayout1 : onMeasure
D/TAG: MyTextView1 : onMeasure
D/TAG: MyTextView2 : onMeasure
D/TAG: MyLinearLayout2 : onMeasure
D/TAG: MyTextView3 : onMeasure
D/TAG: MyTextView4 : onMeasure
D/TAG: MyLinearLayoutR : onLayout
D/TAG: MyLinearLayout1 : onLayout
D/TAG: MyTextView1 : onLayout
D/TAG: MyTextView2 : onLayout
D/TAG: MyLinearLayout2 : onLayout
D/TAG: MyTextView3 : onLayout
D/TAG: MyTextView4 : onLayout
D/TAG: MyTextView1 : onDraw
D/TAG: MyTextView2 : onDraw
D/TAG: MyTextView3 : onDraw
D/TAG: MyTextView4 : onDraw
이렇게 나오게 됩니다.
onMeasure 메소드가 2번 나타나게 되는데 공식문서에 보면
한 번 측정하여 원하는 크기를 구한 다음 만약 그 합의 크기가 너무 크거나 너무 작으면
measure를 다시 실행하여 구체적인 값을 구한다고 되어있습니다.
https://developer.android.com/guide/topics/ui/how-android-draws
위 결과에 대한 코드는 깃허브에 올려놓았으니 참고하시면될거같습니다.
https://github.com/ckdrb7017/BlogProject/tree/master/ViewDrawing
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드 Annotation을 이용한 코드 생성(1) (0) | 2021.08.02 |
---|---|
안드로이드 include, merge, viewstub (0) | 2021.07.08 |
안드로이드 LiveData setValue 와 postValue (0) | 2021.05.13 |
안드로이드 구글STT에서 Recording이 안되는 이유 (9) | 2021.04.26 |
Android MVVM Example 프로젝트 (0) | 2021.04.01 |
댓글