Activity
에서 포커스를 받으면 레이아웃을 그리도록 요청합니다.
Android 프레임워크는 그리기 절차를 처리하지만 Activity
에서는 레이아웃 계층 구조의 루트 노드를 제공해야 합니다.
드로잉은 레이아웃의 루트 노드에서 시작합니다. 레이아웃 트리를 측정하고 그려야 합니다. 드로잉은 트리를 이동하고 잘못된 지역을 교차하는 각 View
를 렌더링합니다. 차례로 각 ViewGroup
에서 각 하위 요소를 그리도록 요청하고(draw()
메서드 사용) 각 View
는 자체 그리기를 담당합니다.
트리는 미리 순서가 지정되어 순회합니다. 즉, 트리에 표시되는 순서대로 하위 요소와 동위 요소를 그리기 전에 상위 요소를 그립니다.
참고: 프레임워크는 올바른 지역에 없는 View
객체를 그리지 않고 View
백그라운드 그리기도 처리합니다.
invalidate()
를 호출하여 View
를 강제로 그릴 수 있습니다.
레이아웃 그리기는 측정 패스와 레이아웃 패스라는 두 패스로 이루어진 프로세스입니다.
측정 패스
측정 패스는 measure(int, int)
로 구현되며 View
트리의 하향식 순회입니다. 각 View
는 반복 중에 트리 아래로 크기 사양을 푸시합니다. 측정 패스가 끝날 때마다 모든 View
에서 측정값을 저장합니다. 두 번째 패스는 layout(int, int, int, int)
에서 발생하며 마찬가지로 하향식입니다. 이 패스 동안 각 상위 요소는 측정 패스에서 계산된 크기를 사용하여 모든 하위 요소를 배치합니다.
View
객체의 measure()
메서드가 반환되면 getMeasuredWidth()
및 getMeasuredHeight()
값 외에도 View
객체의 하위 요소의 값을 모두 설정해야 합니다.
View
객체의 측정된 너비 및 측정된 높이 값은 View
객체의 상위 요소가 부여한 제약 조건을 준수합니다. 그러면 측정 패스가 종료되고 모든 상위 요소에서 하위 요소의 측정값을 모두 수락합니다. 상위 요소 View
에서는 하위 요소를 대상으로 두 번 이상 measure()
를 호출할 수 있습니다. 예를 들어 상위 요소는 크기가 지정되지 않은 각 하위 요소를 한 번 측정하여 원하는 크기를 구한 다음, 각 하위 요소의 무제한 크기가 너무 크거나 너무 작으면 measure()
를 다시 호출 할 수 있습니다(즉, 하위 요소가 각각 할당되는 공간의 크기에 동의하지 않으면 상위 요소가 개입하여 두 번째 패스에서 규칙을 설정).
측정 패스에서는 두 개의 클래스를 사용하여 크기를 전달합니다. ViewGroup.LayoutParams
클래스는 View
객체에서 측정 및 배치 방법을 상위 요소에 알리는 데 사용합니다. 기본 ViewGroup.LayoutParams
클래스에서는 View
의 너비 및 높이만 설명합니다. 각 측정기준으로 다음 중 하나를 지정할 수 있습니다.
- 정확한 숫자
MATCH_PARENT
-View
가 상위 요소(빼기 패딩)만큼 커야 합니다.WRAP_CONTENT
-View
가 콘텐츠(더하기 패딩)를 포함할 만큼만 커야 합니다.
ViewGroup
의 여러 다른 서브클래스에 맞는 ViewGroup.LayoutParams
의 서브클래스가 있습니다.
예를 들어 RelativeLayout
에는 ViewGroup.LayoutParams
의 서브클래스가 있습니다. 이 클래스에는 하위 요소 View
객체를 가로 및 세로 방향으로 중앙에 두는 기능이 포함됩니다.
MeasureSpec
객체는 상위 요소에서 하위 요소로 요구사항을 트리에서 아래로 푸시하는 데 사용합니다. MeasureSpec
은 다음 세 가지 모드 중 하나일 수 있습니다.
UNSPECIFIED
: 상위 요소가 하위 요소View
의 원하는 크기를 판별하는 데 사용합니다. 예를 들어LinearLayout
에서는 높이가UNSPECIFIED
로 설정되고 너비가EXACTLY
240으로 설정된 하위 요소에서measure()
를 호출하여 240픽셀 너비가 지정된 하위 요소View
의 높이를 판별합니다.EXACTLY
: 상위 요소가 하위 요소에 정확한 크기를 적용하는 데 사용합니다. 하위 요소는 이 크기를 사용해야 하며 이것의 모든 하위 요소가 이 크기에 맞도록 보장합니다.AT MOST
: 상위 요소가 하위 요소에 최대 크기를 적용하는 데 사용합니다. 하위 요소는 하위 요소와 이 하위 요소의 모든 하위 요소가 이 크기에 맞도록 보장해야 합니다.
레이아웃 패스
레이아웃을 시작하려면 requestLayout()
을 호출합니다.
이 메서드는 일반적으로 View
가 현재 경계 내에서 더 이상 맞지 않는다고 판단되면 자체적으로 호출됩니다.