2019.11.15
개발하면서 경험했던 것을 정리한 포스트입니다. 오류 지적이나 제안 언제든지 환영합니다.
View
View는 드로잉 및 이벤트처리를 담당하는 사용자 UI 구성요소의 기본 클래스이며, View를 상속받아 구현된 TextView, Button과 같은 특정 기능을 하는 View를 위젯(Widget) 또는 컴포넌트(Component)라고도 합니다.
새로운 View를 만들기 위해서는 View를 상속받아 구현해야합니다. 하지만 이런 View를 배치하기위해서는 ViewGroup 혹은 Container가 필요합니다. ViewGroup또한 View를 상속받아 구현되어있으므로 ViewGroup안에 ViewGroup이 들어갈수도 있습니다.
ViewGroup
위에서 잠깐 설명했지만 ViewGroup은 다른 뷰들을 담을 수 있습니다. 그리고 배치하는 역할을 하는 Layout 및 Container의 기본 클래스입니다. 대표적으로 ConstraintLayout, LinearLayout, RelativeLayout, FrameLayout등이 있습니다. 레이아웃뿐만 아니라 Toolbar, Viewpager, RecyclerView등도 Viewgroup을 상속받아 구현되었습니다.
레이아웃의 계층 구조는 다음과 같습니다.
이렇게 View들은 외부와는 상관없는 자기자신의 속성만을 지정합니다. 그리고 View가 배치되기 위해서는 ViewGroup에서 포함된 LayoutParams를 확장하여 사용함으로써 View가 부모뷰에게 얼마나 크게 배치되고 싶은지에 대해 지정할 수 있게 됩니다. (layout_width, layout_height)
또한 여기서 LayoutParams는 ViewGroup의 sub Class에 따라 각각의 LayoutParams를 가지며, LayoutParams의 구현 방법에 따라 Layout의 배치방법이 달라질 수 있습니다.
View LifeCycle
onMeasure()
- onMeasure()는 Components와 Container간의 렌더링에 아주 중요한 역할을 합니다.
- onMeasure()는 뷰의 크기를 측정하여 너비와 높이를 결정합니다. 이러한 결정은 measure()에 의해서 실행됩니다.
- 이렇게 측정된 너비와 높이를 저장하기 위해서 setMeasureDimension()을 호출해야합니다. 호출하지 않으면 예외를 발생합니다.
onLayout()
- 뷰가 모든 자식뷰에게 크기와 위치를 할당해야 할 때 호출됩니다.
onDraw()
- View를 직접 그리는 단계이며, Canvas를 이용하여 2D그래픽을 그립니다. 3D그래픽에는 적용되지 않습니다.
범주 | 행동 | 설명 |
Creation | Constructors | 코드에서 뷰를 만들 때 호출되는 생성자 형식과 레이아웃 파일에서 뷰를 inflate할때 호출되는 형식이 있습니다. 두 번째 양식은 레이아웃 파일에 정의 된 속성을 구문 분석하고 적용해야합니다. |
onFinishInflate() | 뷰를 호출 한 후 모든 자식이 XML에서 inflate 되었습니다. | |
Layout | onMeasure(int, int) | 이 뷰와 모든 자식의 크기 요구 사항을 결정하기 위해 호출됩니다. |
onLayout(boolean, int, int, int, int) | 이 뷰가 모든 자식뷰에게 크기와 위치를 할당해야 할 때 호출됩니다. | |
onSizeChanged(int, int, int, int) | 이 뷰의 사이즈가 변경되었을 때에 호출됩니다. | |
Drawing | onDraw(android.graphics.Canvas) | 뷰가 내용을 렌더링해야 할 때 호출됩니다. |
Event processing | onKeyDown(int, android.view.KeyEvent) | 새로운 하드웨어 키 이벤트가 발생하면 호출됩니다. |
onKeyUp(int, android.view.KeyEvent) | 하드웨어 키업 이벤트가 발생하면 호출됩니다. | |
onTrackballEvent(android.view.MotionEvent) | 트랙볼 모션 이벤트가 발생하면 호출됩니다. | |
onTouchEvent(android.view.MotionEvent) | 터치 스크린 모션 이벤트가 발생하면 호출됩니다. | |
Focus | onFocusChanged(boolean, int, android.graphics.Rect) | 뷰가 포커스를 얻거나 잃을 때 호출됩니다. |
onWindowFocusChanged(boolean) | 뷰를 포함하는 윈도우가 포커스를 얻거나 잃을 때 호출됩니다. | |
Attaching | onAttachedToWindow() | 뷰가 창에 연결되면 호출됩니다. |
onDetachedFromWindow() | 뷰가 창에서 분리 될 때 호출됩니다. | |
onWindowVisibilityChanged(int) | 뷰를 포함하는 창의 가시성이 변경되면 호출됩니다. |
참고
https://developer.android.com/reference/android/view/View.html?hl=ko#onDraw(android.graphics.Canvas)
https://developer.android.com/guide/topics/ui/declaring-layout?hl=ko
https://developer.android.com/reference/android/view/View.html#summary
https://developer.android.com/reference/android/view/ViewGroup
https://mattlee.tistory.com/74
https://ehdtjq0411.tistory.com/5
감사합니다.
❤️
Love YourSelf
'Android' 카테고리의 다른 글
[시골책방] 앱 출시 !! (0) | 2020.08.17 |
---|---|
[Android] Only fullscreen opaque activities can request orientation (0) | 2020.01.03 |
[Android] Mac에서 Android SDK Path 설정 및 무선 ADB 연결 (0) | 2019.11.17 |
[Android] Q Scoped Storage - MediaStore로 화면 스크린샷 저장하기 - Android Q (0) | 2019.10.29 |
[Android] MediaController dispatchKeyEvent not called (0) | 2019.10.22 |