그룹으로 만들어 커스텀 컴포넌트로 만들어버리자
미리 빌드된 위젯 또는 레이아웃이 요구에 맞지 않을 때 기본 레이아웃 클래스 View 및 ViewGroup에 기반하여 UI를 구축할 수 있는 방법, 뷰
#1. 뷰가 포커스를 얻으면 레이아웃을 그리도록 요청
#2. 루트 노드에서 시작되어 트리를 따라 전위순회방식으로 그림
measure(int widthMeasureSpec, int heightMeasureSpec)
: 뷰의 크기를 알아내는 과정으로, 부모 노드에서 자식노드를 경유하며 실행
① ViewGroup.LayoutParams
[ 부모뷰 ] <----------------- [ 자식뷰 ]
자신이 어떻게 측정되고 위치를 정할지 요청
② ViewGroup.MeasureSpec
[ 부모뷰 ] -----------------> [ 자식뷰 ]
ㅤㅤㅤㅤㅤㅤ요구사항 전달
UNSPECIFIED: 자식뷰 마음대로(view can take as much space as it wants) -> parent가 child가 얼마나 큰 크기를 원하는지 알기 위해 사용함. 이후 measure를 다시 호출함
EXACTLY: 정확한 크기 강요 / 64dp처럼 fixed size 또는 match_parent 사용 시
AT MOST: 최대 크기 강요(view can be as big as it wants up to specified size) / wrap_content 또는 match_parent 사용 시
내부적으로 super.onMeasure(widthMeasureSpec, heightMeasureSpec) > setMeasuredDimension()을 호출
매개변수는 xml에서 받아옴 ex. layout_width = "100dp", layout_height="100dp"으로 설정하면 여기서 그 크기를 측정
따라서 super.onMeasure()을 없애고 임의 값으로 넣는다면? 그 값으로만 크기 측정
layout(int l, int y, int r, int b)
: 부모노드에서 자식 노드를 경유하며 실행되며 뷰와 자식뷰들의 크기와 위치를 할당
draw
: 뷰를 실제로 그리는 단계
+) onDraw() 호출 시 많은 시간소요되고 Scroll, Swipe 시 다시 onDraw()가 호출되기 때문에 함수 내에서 객체 할당을 피하고 한 번 할당된 객체를 재사용하는게 좋음!
연습을 위한 앱
그래프에서 특정 부분 선택 시 선 애니메이션, 후 상세정보
https://medium.com/@MaciejNajbar 여기 글 좀 보자