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 속성을 사용하여 지정됨.