반응형
안녕하세요 돼지왕 왕돼지입니다.
안드로이드를 어느 정도 해본 사람이라면 더 이상 기본 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 등이 전달된다.
반응형
'개발 > 안드로이드' 카테고리의 다른 글
[Android] Fragment LifeCycle (프레그먼트 생명주기) (0) | 2015.03.27 |
---|---|
[Android]WebView를 JavaScript와 연동 (0) | 2015.03.24 |
Android Studio Sign APK 만들기 (0) | 2015.01.08 |
서포트 라이브러리(v7)로 Material Design 적용하기 - (2) 색상 테마 적용 (0) | 2015.01.08 |
액티비티 전체를 덮는 네비게이션 드로어 만들기 (0) | 2015.01.08 |
댓글