draw()
메서드를 통해 각 하위요소(View or ViewGroup)를 그림.측정 패스
와 레이아웃 패스
라는 두 패스로 레이아웃을 그림.View의 크기를 측정하는 단계임.
measure()
메서드로 View의 크기를 알아보기 위해 호출되고, 상위 항목은 너비와 높이 매개변수에 정보를 제공함.
measure()
가 반환되면 측정된 값(MeasureSpec)과 모든 View객체의 하위 요소 값을 설정함.
measure()
는 내부적으로 onMeasure
메서드를 호출하고 실제 크기 계산은 onMeasure()
메서드에서 실행됨.
측정 패스는 두 클래스를 사용해 치수를 정함.
ViewGroup.LayoutParams
: View 객체가 어떻게 측정되고 배치되어 질지를 정함.Base ViewGroup.LayoutParam
: 뷰의 가로와 세로가 어떻게 커질지를 정함.측정 패스를 정리하자면
measure
단계에서 ViewGroup.LayoutParams
를 사용하여 View의 크기를 알아보고MeasureSpec
을 생성하여 onMeasure
를 호출 후 onMeasure
에서 MeasureSpec
에 기반한 최종적은 View의 크기를 결정함.layout
메서드로 호출이 시작되고, 이는 뷰의 최종적인 위치를 지정함.onLayout()
은 뷰 그룹이 자식 뷰들을 어떻게 배치할 것인지를 결정하는 로직을 포함.requestLayout()
은 어떤 시점에서 뷰의 경계가 변경되었다면, View를 다시 측정하기 위해 이를 호출하여 Mesure, Layout 단계를 다시 거칠 수 있음.다음과 같이 루트 레이아웃 트리가 있다고 가정하고, 측정, 레이아웃 그려지는 과정을 살펴보자.
전위순회 방식으로 측정패스와 레이아웃 패스가 진행되고 그려짐
D/TAG: ConstraintLayoutR : onMeasure
D/TAG: ConstraintLayout1 : onMeasure
D/TAG: TextView1 : onMeasure
D/TAG: TextView2 : onMeasure
D/TAG: ConstraintLayout2 : onMeasure
D/TAG: TextView3 : onMeasure
D/TAG: TextView4 : onMeasure
D/TAG: ConstraintLayoutR : onMeasure
D/TAG: ConstraintLayout1 : onMeasure
D/TAG: TextView1 : onMeasure
D/TAG: TextView2 : onMeasure
D/TAG: ConstraintLayout2 : onMeasure
D/TAG: TextView3 : onMeasure
D/TAG: TextView4 : onMeasure
D/TAG: ConstraintLayoutR : onLayout
D/TAG: ConstraintLayout1 : onLayout
D/TAG: TextView1 : onLayout
D/TAG: TextView2 : onLayout
D/TAG: ConstraintLayout2 : onLayout
D/TAG: TextView3 : onLayout
D/TAG: TextView4 : onLayout
D/TAG: TextView1 : onDraw
D/TAG: TextView2 : onDraw
D/TAG: TextView3 : onDraw
D/TAG: TextView4 : onDraw
두 번 이상 measure()
메서드를 호출 할 수 있는데, 이는 하위 요소의 제한되지 않은 크기의 합계가 너무 크거나 너무 작을 경우 상위 요소는 하위 요소의 크기를 제한하는 값으로 다시호출 할 수 있음.
루트 레이아웃 부터 전위순회로 뷰, 뷰 그룹들이 그려지는걸 확인할 수 있음.
onMeasure()
, onLayout()
은 맞춤 측정이나 레이아웃 로직을 구현 할 때 재정의 해서 사용onMeasure()
를 실행한 후, 다시 루트 레이아웃 부터 onLayout()
을 수행함.LayoutParams
은 레이아웃에 대한 매개변수를 나타냄.android:layout_width
와 android:layout_height
속성을 사용하여 지정됨.