본문 바로가기
개발/안드로이드

안드로이드 뷰가 그려지는 과정

by 창이2 2021. 6. 9.

안녕하세요.

이번 포스팅에서는 안드로이드에서 뷰가 그려지는 과정에 대해 포스팅해보겠습니다.

액티비티가 포커스를 얻게 될때 레이아웃을 그리게 요청하는데요.

 

뷰가 그려지는 건 레이아웃 트리의 루트노드 부터 시작하게 됩니다.

레이아웃 트리는 말그대로 레이아웃에 있는 뷰그룹이나 뷰들을 트리형태로 나타난건데

예를 들면

이런 구조로 되어 있다면 

이를 오른쪽 처럼 전위순회 하면서 그려지는 방식입니다.

 

레이아웃을 그리는 과정은 측정패스(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

 

Android 드로잉 보기 방법  |  Android 개발자  |  Android Developers

활동이 포커스를 받으면 레이아웃을 그리라는 요청을 받습니다. Android 프레임워크에서 그리기 절차를 처리하지만 활동에서 레이아웃 계층 구조의 루트 노드를 제공해야 합니다. 그리기는 레이

developer.android.com

 

위 결과에 대한 코드는 깃허브에 올려놓았으니 참고하시면될거같습니다.

 

https://github.com/ckdrb7017/BlogProject/tree/master/ViewDrawing

 

ckdrb7017/BlogProject

개인 블로그 프로젝트를 올리는 곳입니다. Contribute to ckdrb7017/BlogProject development by creating an account on GitHub.

github.com

 

댓글