4. 기존 View에 attribute 추가
• 추가로 필요한 Attribute가 있다면, 이를
받아서 처리할 수 있도록 View를 준비.
• 대부분 경우에 기존 View 기능 유지를 하
면서 field 확장 경우에는 상속을 해서 관
련 attribute를 가져오도록 구현
6. Activity에서 View를 낳고
• Activity 생명 주기 중 onResume 이후에
• View의 onDraw / onMeasure / onLayout
호출이 이루어집니다.
– onDraw: View 자체를 그리는 역할
– onMeasure: 내가 차지하고자 희망하는 공간
을 부모에게 알려주는 역할
– onLayout: 만약 자식 View들이 있을 때, 이들
에게 크기와 위치를 할당 할 때 사용합니다.
즉, 자식 View가 없으면 사용하지 않습니다.
7. onMeasure에 대해서 좀 더
• void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
– 특정 View가 차지하게 될 크기에 대해서는 Parent가 하위 View와 협상
을 하게 됩니다. 이 과정에서 Parent가 하위 View에게 “늬 얼마만큼 사
이즈를 희망하니?”하고 묻는 것이 onMeasure 입니다.
– Void로 반환 값은 없지만, 질문 받은 View는 아래 함수 호출해서 자신
의지를 밝힙니다.
• setMeasuredDimension (int measuredWidth, int measuredHeight)
– 인자로 넘겨 받은 width/heightMeasureSpec은 모드와 실제값을 합쳐져
서 구성이 됩니다.
• 상위 2 bit: 모드를 나타냄. AT_MOST (최대), EXACTLY (정확히), UNSPECIFIED (미지정)
• 나머지 32 bit: 실제 값을 의미
• getMode / getSize / makeMeasureSpec
8. onMeasure 후 onDraw
• 상위 View에서 전체적으로 onMeasure를 통해서 서로 필요한
공간에 대해서 협의를 하고 최종 사이즈를 결정한 뒤에 각
View에게 이제 그리라고 이야기 합니다.
• 이렇게 onDraw를 시작.
– 상위 Activity.onResume > onMeasure > onDraw 순으로 수행
• onDraw를 통해서 원하는 view를 그리고, 강제로 그리고자 하
는 경우에는 invalidate 함수를 호출.
– 만약 자신이 onDraw를 하는 경우가 있을 때에는
setWillNotDraw 함수 값을 명확히 설정해 주는 것이 권장됩니다.