본문 바로가기
개발/안드로이드

CustomView 생성시 override 해야 할 function들

by darksilber 2015. 1. 26.
반응형

출처  - http://aroundck.tistory.com/entry/Android%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-CustomView-%EC%83%9D%EC%84%B1%EC%8B%9C-override-%ED%95%B4%EC%95%BC-%ED%95%A0-function%EB%93%A4

 

안녕하세요 돼지왕 왕돼지입니다.
안드로이드를 어느 정도 해본 사람이라면 더 이상 기본 view 로 만족하지 못하는 경우가 생기기 쉽상입니다.

게다가, 더 효율적으로 프로그램을 운영, 관리하기 위해서도 custom view 가 필수불가결한 경우도 생기고요.
그래서 View 를 extend 할 경우 override 하는 function 들에 대해서 한번 알아보았습니다. 
( 여기서 custom view 의 class 는 CustomView 라고 명명하고 기술하였습니다. )

 

Constructors


public CustomView( Context context )
// 소스상에서 생성할 때 쓰인다.

public CustomView( Context context, AttributeSet attrs )
// xml 을 통해 생성할 때 attribute 들이 attrs 로 넘어온다. 이 때 경유하는 constructor.
// 대부분 defStyle 이 있는 3번째 constructor 를 통한다.

public CustomView( Context context, AttributeSet attrs, int defStyle )
// xml 을 통해 생성하면서 style 도 함께 적용되어 있다면 타게 되는 constructor. defStyle = 0 이면 no style 을 의미한다.

 

 
 

onFinishInflate()


- xml 로부터 inflate 가 끝난 후에 불린다.
- 보통 inflate 가 끝났기 때문에 view에 관련된 초기화가 주고 이루어진다. 
 


onMeasure( int widthMeasureSpec, int heightMeasureSpec ) - 중요!!

 
- withMeasureSpec heightMeasureSpec 은 부모뷰로부터 결정된 치수가 넘어온다.
  MeasureSpec.getSize( widthMeasureSpec ) 을 통해 해당 치수를 얻어올 수 있다.
  MeasureSpec.getMode( widthMeasureSpec ) 을 통해 해당 치수의 mode 를 얻을 수 있다.


<Mode>
MeasureSpec.AT_MOST : wrap_content 에 매핑되며 뷰 내부의 크기에 따라 크기가 달라진다.
MeasureSpec.EXACTLY : fill_parent, match_parent 로 외부에서 미리 크기가 지정되었다.
MeasureSpec.UNSPECIFIED : Mode 가 설정되지 않았을 경우. 소스상에서 직접 넣었을 때 주로 불립니다.

-- MeasureSpec.EXACTLY 의 경우는 사이즈가 정해진 단계이기 때문에 MeasureSpec.getSize( widthMeasureSpec ) 으로
 정확한 사이즈를 얻어올 수 있다.
-- MeasureSpec.AT_MOST 의 경우는 사이즈가 정해지지 않은 단계이기 때문에 사이즈를 정해주어야 한다.

- setMeasuredDimension( measuredWidth, measuredHeight ) 함수를 통해 사이즈를 정해준다.
  super.onMeasure() 에 default setMeasuredDimension() 이 구현되어 있어서 기본을 사용할 경우,
  superClass 의 onMeasure() 를 호출해주면 된다.
 
 - 이 뷰가 부모뷰가 될 경우에는 자식뷰의 measure() 를 호출해줘야 한다. ( 그래야 자식의 onMeasure 가 불릴테니 ) 
 
 
<example>

...
int widthMode = MeasureSpec.getMode( widthMeasureSpec );
int width = 0;
if ( widthMode == MeasureSpec.UNSPECIFIED )
    width = widthMeasureSpec;
else if ( widthMode == MeasureSpec.AT_MOST )
    width = 50;
else if ( widthMode == MeasureSpec.EXACTLY )
    width = MeasureSpec.getSize( widthMeasureSpec );
setMeasuredDimension( width, height ); 
...

 

 
 

onLayout( boolean changed, int left, int top, int right, int bottom ) - 중요!!


- View 를 layout 시키는 역할을 한다. 즉 view 의 위치를 정해준다.
- onMeasure 를 통해 사이즈가 결정된 후에 onLayout 이 불린다.
- 부모뷰일때 주로 쓰이며, child 뷰를 붙일 때 위치를 정해주는데 사용한다.
- 넘어오는 파라메터는 어플리케이션 전체를 기준으로 위치가 넘어온다. ( 주의!! )
 
 
 

 onSizeChanged( int width, int height, int oldWidth, int oldHeight )


- 뷰의 크기가 변경되었을 때 호출된다. 
 


onDraw( Canvas canvas ) - 중요!


- View class 의 핵심이다.
- 실제로 화면을 그리는 영역으로 must be-implemented function 이다.
- 그리는 영역은 getMeasuredWidth() 와 getMeasruedHeight() 로 해당하는 rectangle 영역만 그려주면 된다. 
 


기타 function들.


 onKeyDown( int keyCode, KeyEvent event )


- view 가 focus 가 있을 때 key input 에 반응하는 listener function 이다.
- focus 가 있어야 한다는 조건이 있기 때문에 setFocusable( true ) 가 설정되어 있어야 한다.
- keyCode 에는 눌린 키의 코드가 event 에는  down, up, press 등이 전달된다.


onTouchEvent( MotionEvent event )


- touch 에 대한 listener function.
- event 에 down, up, press, move 등이 전달된다.
반응형

댓글