출처 : http://developer.android.com/guide/topics/ui/how-android-draws.html
아래 글은 "출처"의 내용을 각색했다.
안드로이드에서 View 가 어떻게 그려지는가.
Android UI 는 hierarchy 를 가지고 있는데 여기에는 notification bar, navigation bar같은 system elements들 그리고 현재 activity 의 view hierarchy 로 구성되어 있다.Activity 가foucs 가 될 때 system(framework ) 은 Activity 이 가진 view hierarchy 의 root node를 요청한다.(참고로, 우리가 setContentView 를 호출할 때 이 root node 를 정하게 되는 것이다.)
Drawing layout
이 View hierarchy를 그리는 것, 다시 말하면 layout 을 그리는 것은 2개의 pass(Drawing layout) 로 이뤄져 있다.- Measure pass :
measure() 를 호출한다.
measure pass 가 끝나면 각각의 view 는 자신의 measurements(치수) 를 갖고 있게 된다. - Layout pass :
layout() 을 호출한다.
각각의 parent view는 Measure pass에서 얻은 size 를 가지고, 그들의 children 의 위치시켜야 한다.
parent View는 그들의 children 에서 measure() 을 호출하기도 한다. 예를 들면 정해놓지 않은 치수(unspecified dimensions) 를 정하기 위해서 parent 가 children 내에서 measure() 을 호출하기도 한다.
이렇게 layout 을 정하면서 그려나간다. 그래서 parents 가 먼저 그려지고, 그 위에 children 이 그려지는 것이다. 이 때 invalidated region 만 그리게 된다.
Measure pass 에서 사용되는 classes
Measure pass 에서는 2개의 classes 가 사용된다.- ViewGroup.LayoutParams : View 가 자신들이 parent 에게 자신들이 어떻게 측정되어지고(measured), 위치되었으면 좋겠다는 것을 얘기할 때 쓰인다.
- 확실한 숫자 :
android:layout_width="320dp" - FILL_PARENT == MATCH_PARENT
android:layout_width="match_parent" - WRAP_CONTENT
android:layout_width="wrap_content" - ViewGroup.MeasureSpecs : 3가지 모드를 가지고 있다.
- UNSPECIFIED : parent 에 의해 사용된다. 아무런 제한도 두지 않는다. child view 가 원하는 사이즈를 갖을 수 있다.
- EXACTLY : parent 에 의해 사용된다. child 에게 정확한 사이즈를 주기 위해서 사용한다. 그러면 이 사이즈 내에서 child View 는 자신의 후손(descendants) 들을 맞춰야 한다.
- AT_MOST : parent가 child 의 maximum size 를 설정하기 위해 사용된다.
댓글 없음:
댓글 쓰기