본문 바로가기
코딩일기/android studio

Android 독학 9일차 : View 생명주기(View를 그리는 과정)

by 욱파이어니어 2021. 3. 16.
728x90
반응형

View의 생명주기에 대해서 공부를 하는 이유는 내가 이제 커스텀 View에 대해서 설명할 것이기 때문이다.

 

커스텀 View는 우리가 직접 View 클래스를 상속받아서 나만의 View를 만들거나 기존의 View에서 살짝 다르게 만들려고 하는 것이다.

 

View클래스를 왜 상속받느냐 

그 이유는 간단하다 View는 모든 View의 최상위에 있기 때문에 View에서의 모든 이벤트를 사용할 수 있기 때문이다.

 

참조 블로그 : https://www.charlezz.com/?p=29013

이렇기 때문에 커스텀을 할 거면 View 클래스를 상속받는 것이다.

 

그럼 커스텀으로 View를 만들 것이기 때문에 View의 생명 주기는 꼭 알아 둬야 한다.

 

그럼 이제 View의 생명주기를 보자.

참조 블로그 : https://www.charlezz.com/?p=29013

위의 사진처럼 여러 메서드를 통해서 사용자들에게 UI를 보여 주게 된다. 그럼 각각의 단계부터 들어가 보자.

 

1. Constructor(생성자)

모든 클래스는 당연히 생성자부터 시작을 한다.

View의 생성자는 총 4가지가 존재한다.

 

1-1. View(Context context) 

xml로부터가 아니라 코드 상에서 View를 생성할 경우 호출하게 되는 생성자이다.

 

1-2. View(Context context, AttributeSet attrs)

LayoutInflater에 의해 호출되는 생성자이다. 즉 xml에서 해당 뷰를 생성할 경우 호출되는 생성자이다.

AttributeSet는 View를 생성될 때 사용하는 속성들에 대한 정보가 있는 곳 인대 여기서 정보를 가져와서 View를 만드는 것이다. 따라서 CustomView를 만들 때 이 생성자를 꼭 적어야 한다.

 

1-3. View(Context context, AttributeSet attrs, int defStyleAttr)

이건 1-2와 같이 LayoutInfalater에 의해 호출되는 생성자랑 똑같다. 하지만 defStyleAttr이라는 게 있는데 이건 

버튼이나 이런 것들을 쓸 때 디폴트로 위치나 이런 게 정해져 있는데 그런 값을 가져와서 AttributeSet에 담아서 보내는 역할을 한다.

 

1-4. View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

1-3과 똑같은데 여기서는 보면 defStyleRes가 추가되어 있다.

이건 style파일에 있는 것을 가져와서 해당 속성을 AttributeSet에 포함시켜서 View를 생성한다는 뜻이다.

 

2. onAttachedToWindow()

attach에서 알 수 있듯이 해당 부분은 화면에 뷰를 붙이는 부분이다.

화면에 뷰를 붙여서 화면에 그릴 준비를 하는 것이다.

 

이제 여기서 뷰를 그릴 준비를 완료했다고 보면 된다.

그림으로 따진다면 그림을 그릴 준비물들을 다 준비했다고 보면 된다.

 

이제부터는 그림을 그릴 건데 순서는 

measure -> layout -> draw이다.

 

일단 일상생활로 빗대서 표현하자면

그림을 그리기 위해서 어떤 크기의 도화지에다가 그림을 그릴 건지 선택을 하고(measure)

해당 도화지에 그림들을 어떻게 배치할 것인지 결정한다(layout)

결정된 위치에 그림을 그리는 것이다. (draw)

 

이런 방식으로 View가 생성된다고 보면 된다.

그렇다면 이제 각각의 메서드 별로 자세히 한번 알아보자.

 

3. measure()

View의 크기를 요청해달라고 요청(onMeasure 호출)

 

4. onMeasure()

뷰의 크기를 결정하기 위해 호출되는 함수이다.

이 함수 내에서 크기를 결정을 하면 setMeasuredDimension()이라는 함수를 호출해서 결정된 크기로 설정을 해야 한다.

 

5. layout()

View에 content(자식)들의 위치를 결정해달라고 요청(onLayout호출).

 

6. onLayout()

자식들의 위치를 결정짓는 함수

 

7. dispatchToDraw()

자식의 View를 그린다.

 

8. draw()

View에 그리기를 요청(onDraw 호출)

 

9. onDraw()

View가 가지고 있는 content(내용물)를 그린다.

 

이런 식으로 생명주기가 된다.

 

근데 위의 그림을 보면 invalidate()랑 requestLayout()이 있는데 

이 둘은 무엇이냐

invalidate()는 부모 View에서 그 안의 자식 뷰들을 다시 그려 달라는 뜻이다.

 

그리고 

requestLayout()은 measure()를 다시 호출해서 부모 View의 크기부터 다시 설정해서 그리라는 뜻이다.

 

사실 이것 이외에도 여러 가지 메소드들이 더 있는데 일단은 간단한 생명주기를 알아보고자 했기 때문에 

최대한 단순하고 내가 설명할 수 있는 선까지 적었다. 

 

View의 생명 주기에 좀 더 자세히 공부하고 싶다면 내가 참조한 사이트들을 한번 보면 될 것 같다. 

 

참조 사이트

www.charlezz.com/?p=29013

 

Android에서 View의 생명주기 | 찰스의 안드로이드

https://proandroiddev.com/the-life-cycle-of-a-view-in-android-6a2c4665b95e을 번역한 내용입니다. 안드로이드 앱을 실행할 때 우리가 가장 먼저 스크린에서 볼 수 있는 것이 View라고 말할 수 있다. View 클래스는 사

www.charlezz.com

www.youtube.com/watch?v=0Yccqj5tm6s

개인적으로 이 동영상이 많은 도움이 되었다.

medium.com/@phm4859/android-%EA%B0%80-%EB%B7%B0%EB%A5%BC-%EA%B7%B8%EB%A6%AC%EB%8A%94-%EA%B3%BC%EC%A0%95-1622d60002a0

 

Android 가 뷰를 그리는 과정

커스텀뷰를 만들다가, 안드로이드가 뷰를 그리는 과정을 좀 정리해놓자는 생각에 올리게되었습니다.

medium.com

 

반응형