티스토리 뷰
CustomView 는 자주 사용하고, 또 면접에서도 많이 물어보는 것 같다.
이참에 제대로 알아두자 !! 해서 강의 듣고 정리해봄 !!
강의 : Tacademy - Android Application 프로그래밍 중급 19강 Custom View | T아카데미
https://www.youtube.com/watch?v=0Yccqj5tm6s
문서 : https://developer.android.com/guide/topics/ui/custom-components?hl=ko
CustomView 개요
Android는 기본 레이아웃 클래스 View 및 ViewGroup에 기반하여 UI를 구축할 수 있는 정교하고 강력한 구성요소화된 모델을 제공합니다. 우선 플랫폼에는 UI를 구성하는 데 사용할 수 있는 미리 빌드된 다양한 View 및 ViewGroup 서브 클래스(위젯, 레이아웃)가 포함되어 있습니다. 만약, 빌드된 위젯 또는 레이아웃이 맞지 않는다면, View 서브클래스를 직접 만들 수 있습니다. - AndroidDeveloper : 맞춤 뷰 구성요소의 개요 내용 중 일부
View 속성 정의 및 사용 방법
view를 생성하기 위해서는 먼저 xml에 view에 대한 속성을 정의해야 함.
이렇게 정의한 xml파일 내에 있는 속성들을 LayoutInflater가 읽어들여서 AttributeSet 에 담음.
AttributeSet을 이용하여 View를 생성함.
->View(Context context, AttributeSet attrs)
또는,
Theme에 있는 defStyleAttr 속성을 이용하여 View를 생성할 수 있음.
(defStyleAttr : 기본으로 설정되어 있는 속성들의 집합. - Ex : Button의 크기, 이미지, 색상, ... )
->View(Context context, AttributeSet attrs, int defStyleAttr)
안드로이드의 그리기 과정
1) View의 크기를 결정 -> measure
- 크기를 결정하기 위해 measure 함수를 호출하면, onMeasure()가 호출되어 크기를 결정(크기 계산)
- 크기를 결정(계산)했으면, 계산된 결과를 설정해야 하는데 setMeasuredDimension을 호출하여 설정함.(나의 width는 ~고 Height는 ~야 라고 설정)
- 다시 크기를 재계산해야 할 경우, requestLayout 을 호출한 후에 크기 재결정.
2) Content를 특정 위치에 배치 -> layout
- 크기를 결정했고 배치하기 위해서 layout을 호출하면, onLayout()이 호출되어 ViewGroup에서는 Child의 위치를 결정
3) View 그리기 -> draw
: 이후부터는 draw만 호출 ( 크기가 변경되기 전까지 ... )
- draw는 그리기 기능을 하는 함수로 background를 그림.
- onDraw()를 호출하여 자신의 그림을 그림
- dispatchDraw를 호출하여 child에 대한 그리기를 해 줌.
- 다시 그릴경우 invalidate()를 호출
* 크기 결정 - measure
public final void measure(int widthMeasureSpec, int heightMeasureSpec)
- View의 크기를 결정해달라고 요청할 때 사용됨
- widthMeasureSpec, heightMeasureSpec 은 크기 결정에 있어 사용할 제한 조건임
( Ex : 너 맘대로 결정해라, 아무리 커도 부모 크기 내로 결정해라, 너의 크기는 이거다, ... )
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- widthMeasureSpec, heightMeasureSpec 을 기반으로 View의 크기 결정
- View의 크기가 결정되면 setMeasuredDimension 호출해야 함.
View의 상태 저장 및 복원
앱의 Process가 갑자기 죽을 것을대비해서 값을 저장해 놓을 수 있도록 제공
onSaveInstanceState() : View의 상태를 저장하는 Parcelable을 생성하고 넘겨줌
onRestoreInstanceState() : 파라미터로 넘어온 Parcelable로부터 View의 값을 복원
View.BaseSavedState
- View의 상태를 저장한 Parcelable을 만들기 위해 사용되는 class.
'android' 카테고리의 다른 글
[android] Android Jetpack : ViewModel (0) | 2020.06.10 |
---|---|
[android] build.gradle의 속성 정리 (0) | 2020.06.01 |
[android] MVVM 디자인 패턴 - AAC (0) | 2020.05.29 |
[android] 안드로이드 개념 - Activity의 launchMode 의 Flag 정리 (0) | 2020.05.29 |
[android] MIME Type (0) | 2020.05.29 |