본문 바로가기
개발 log (개발)/mobile

'커스텀달력' 구현을 위한 커스텀뷰 #1

by abbear25 2016. 9. 14.

안드로이드 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 등 전달





반응형