본문 바로가기

gyub's 공부일기/그저 내 공부

View Lifecycle

※※   그저 공부하는 흐름대로 작성한 것이니 정돈된 글이 아님 주의 ※※

View Lifecycle

 

Constructor

모든 뷰는 생성자에서 출발 -> 생성자에서 초기화 -> defalut 값 설정

뷰는 초기 설정을 쉽게 하기위해 AttributeSet 인터페이스 지원=> 먼저 attrs.xml파일을 만들고 이걸로 뷰의 설정을 쉽게 한다.

 

onAttachedWindow

부모 뷰가 addView(childView)를 호출 -> 자식 뷰는 윈도우에 붙음(attached)

이때부터 뷰id를 통해 접근 가능.

 

onMeasure

뷰의 크기를 측정하는 단계.

대부분 레이아웃에 맞게 특정 크기를 가져야함.

세 단계 과정이 있음

1) 뷰가 원하는 사이즈 계산

2) MeasureSpec에 따라 크기와 mode를 가져옴

  • UNSPECIFIED - 부모 뷰는 자식 뷰가 원하는 치수대로 결정한다.
  • EXACTLY - 부모 뷰가 자식 뷰에게 정확한 크기를 강요한다.
  • AT MOST - 부모 뷰가 자식 뷰에게 최대 크기를 강요한다.

3) MeasureSpec의 mode 체크 후 뷰의 크기 적용

        switch (specMode) {
        case MeasureSpec.UNSPECIFIED:
            result = size;
            break;
        case MeasureSpec.AT_MOST:
        case MeasureSpec.EXACTLY:
            result = specSize;
            break;
        }

 

onLayout

뷰의크기와 위치를 할당.

 

onDraw

뷰를 실제로 그리는 단계이며 Canvas와 Paint 객체를 사용하여 그림.

Canvas객체는 onDraw 메서드에 파라미터로 제공

Canvas를 이용해 뷰의 모양을 그림

Paint를 이용해 뷰의 색을 그림.

 

주의점 

onDraw()는 호출 시 많은 시간이 소요

Scroll 또는 Swipe등을 할 경우 뷰는 다시 onDraw()와 onLayout을 다시 호출

따라서 함수 내에서 객체할당을 하고 한 번 할당한 객체를 재 사용 권장

 

 

invalidate()와 requestLayout()

 

1) invalidate(): 단순히 뷰를 그릴 때 사용

ex)  뷰의 text또는 color가 변경되거나, touch interactivity가 발생할 때

 onDraw() 함수를 재호출해 뷰 업데이트,

뷰가 점점 커지는 Animation일 때 각 단계마다 invalidate() 호출

 

2) requestLayout(): onMeasure()부터 다시 뷰를 그림. 뷰의 사이즈가 변경될 때 그것을 다시 측정해야 하기에 lifecycle은 onMeasure()부터 순회하며 뷰를 그린다.

 

 

반응형

'gyub's 공부일기 > 그저 내 공부' 카테고리의 다른 글

Iterator  (0) 2021.04.01
Vector vs ArrayList vs LinkedList  (0) 2021.04.01
String Literal  (0) 2021.04.01
Activity LifeCycle  (0) 2021.03.31
View가 그려지는 과정  (0) 2021.03.31