[컴][안드로이드] 안드로이드에서 View 가 어떻게 그려지는가


출처 : 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) 로 이뤄져 있다.
  1. Measure pass :
    measure() 를 호출한다.
    measure pass 가 끝나면 각각의 view 는 자신의 measurements(치수) 를 갖고 있게 된다.
  2. 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 가 사용된다.
  1. ViewGroup.LayoutParams : View 가 자신들이 parent 에게 자신들이 어떻게 측정되어지고(measured), 위치되었으면 좋겠다는 것을 얘기할 때 쓰인다.
    1. 확실한 숫자 :
      android:layout_width="320dp"
    2. FILL_PARENT == MATCH_PARENT
      android:layout_width="match_parent"
    3. WRAP_CONTENT
      android:layout_width="wrap_content"
  2. ViewGroup.MeasureSpecs : 3가지 모드를 가지고 있다.
    1. UNSPECIFIED : parent 에 의해 사용된다. 아무런 제한도 두지 않는다. child view 가 원하는 사이즈를 갖을 수 있다.
    2. EXACTLY : parent 에 의해 사용된다. child 에게 정확한 사이즈를 주기 위해서 사용한다. 그러면 이 사이즈 내에서 child View 는 자신의 후손(descendants) 들을 맞춰야 한다.
    3. AT_MOST : parent가 child 의 maximum size 를 설정하기 위해 사용된다.

댓글 없음:

댓글 쓰기