🎨
View가 그려지는 과정
March 09, 2023
전위순회 방식을 쓰기 때문에, 부모부터 자식 뷰 순서로 그려지게 됨
onMeasure
- 뷰의 크기를 계산
- 모든 뷰는 각각 자신의 width, height를 계산
- measure 단계에서는 부모 - 자식 뷰 간의 크기 정보 전달을 위해 두 가지 클래스를 사용
ViewGroup.LayoutParams
: 자식 뷰가 부모 뷰에게 자신이 어떻게 측정되고 위치를 정할지 요청할 때 사용(how big)- DP, PX…: 자식 뷰가 원하는 사이즈
- MATCH_PARENT: 부모 뷰 사이즈와 똑같이 자식 뷰 사이즈 지정
- WRAP_CONTENT: 부모 뷰 안에서 content를 표현할 수 있는 fit한 사이즈 지정
ViewGroup.MeasureSpecs
: 부모 뷰가 자식 뷰에게 요구 사항을 전달할 때 사용- UNSPECIFIED: 부모 뷰는 자식 뷰가 원하는 사이즈로 결정
- EXACTLY: 부모 뷰가 자식 뷰의 사이즈를 정확히 지정할 때
- AT_MOST: 부모 뷰가 자식 뷰의 최대 사이즈를 지정할 때
onLayout
- 뷰의 크기와 위치를 할당
- 부모 기준의 상대적 위치(left, top, right, bottom)을 계산
onDraw
- 뷰를 그리는 단계
- canvas: 뷰의 모양을 그리는 객체
- paint: 뷰의 색상을 칠하는 객체
- onMeasure에서 측정한 크기와 onLayout에서 계산한 위치에 뷰를 그림
- 이 콜백은 언제든 다시 호출될 수 있음
- scroll이나 swipe를 하게 되면 뷰는 onDraw를 다시 호출
- 객체 할당과 같이 리소스가 많이 소모되는 로직은 추가하지 말 것
ViewUpdate
런타임에 뷰를 다시 그리게 하는 함수
- invalidate
- view에 변화가 생겨서 다시 그려야 할 때
- color 변화 등
- requestLayout
- view를 처음부터 그려야 할 때
- 크기가 변화해서 measure부터 다시 해야 할 때