안드로이드 View는 반드시 ViewGroup에 담겨야 함
그래서 측정이라는 단계가 필요
View가 자신의 크기를 결정하기 위해서 자신을 담고 있는
ViewGroup의 크기와 거기에서 자신이 사용할 수 있는 크기를 알아야 함
또한 View 자신의 크기와 사용할 영역의 크기도 알아야 함
View호출 순서
Constructor() -> onAttachedToWindow() -> measure() -> onMeasure() -> layout()
-> onLayout() -> dispatchDraw() -> draw() -> onDraw()
Override해야할 메소드
1.onMeasure(int widthMeasureSpec, int heightMeasureSpec)
view 자신의 크기를 결정하는 함수
...Spec은 부모 뷰로부터 결정된 치수가 넘어옴
measure() -> onMeasure() -> setMeasuredDimension()
int widthMode = MeasureSpec.getMode(widthMeasureSpec)
Mode 1)MeasureSpec.UNSPECIFIED
java코드 상에서 뷰를 생성한 경우, 코드 내 지정된 값 그대로 반환
super.onMeasure() 호출
Mode 2)MeasureSpec.AT_MOST
wrap_content로 설정된 경우, 뷰가 최대로 가질수 있는 크기를 반환
이를 바탕으로 내부크기 계산해야 함. setMeasuredDimension(width, height)사용
Mode 3)MeasureSpec.EXACTLY
match_parent로 설정된 경우, 부모 layout에서 해당 뷰의 크기 지정해서 반환
super.onMeasure() 호출
int width = MeasureSpec.getSize(widthMeasureSpec)
measureChild() : 자식 뷰의 크기를 계산
getChildMeasureSpec() : 특정 자식 뷰의 MeasureSpect 생성
2.onLayout
자식 뷰의 위치를 지정(기기 화면에 대한 절대적 위치 지정)
메소드 : layout() -> layout() -> onLayout()
this.getPaddingTop() : 자신의 위쪽 패딩 값. 외에 Left() / Right() / Bottom()
this.getMeasuredWidth() : 자신의 크기 계산후 나온 넓이
this.getMeasuredHeight() : 자신의 크기 계산후 나온 높이
getChildCount() : 자식 뷰의 갯수 반환
child.measure() : 자식 뷰의 크기 반환(보통 MeasureSpec.AT_MOST 사용)
measure() 사용 후에
child.getMeasuredWidth() : 자식 뷰의 넓이 획득
child.getMeasuredHeight() : 자식 뷰의 높이 획득
child.layout() : 자식 뷰의 위치를 지정
3. onDraw (Canvas cnavas)
화면을 그리는 일(자신을 기준으로 한 좌표)
자신을 먼저 그린 후에 자식 그리기
getMeasuredWidth() : 자신의 넓이를 반환
getMeasuredHeight() : 자신의 높이를 반환
기타
onSizeChanged() : 뷰의 크기가 변경된 경우 호출
onKeyDown(int keyCode, KeyEvent event)
: view가 focus가 있을 때 key input에 반응하는 listener function
setFocusable(true) 무조건 설정 되어야 함
event에 down, up, press 등 전달
onTouchEvent(MotionEvent event)
: touch에 대한 listener function
event에 down, up, press, move 등 전달
'개발 log (개발) > mobile' 카테고리의 다른 글
'내 위치 확인' 을 위한 googlemap 및 geocoding (0) | 2016.10.25 |
---|---|
'내 위치 확인' 을 위한 gps 다루기 (0) | 2016.10.25 |
'커스텀달력' 구현을 위한 이론(Fragment) (0) | 2016.09.06 |
'커스텀갤러리' 구현을 위한 이론(ExternalStorage, DrawingCache) (0) | 2016.09.03 |
'커스텀갤러리' 구현을 위한 이론(Media_DB정보) (0) | 2016.08.30 |