안드로이드 화면이 그려지는 과정

안드로이드 화면 구성 요소

Window > Surface > Canvas > View

  1. Window

    하나의 화면에 여러개의 Window가 존재할 수 있고, WindowManager에 의해 관리된다.

    앱은 WindowManager와 상호작용하여, Window를 만들고 Window 표면에 그리기 위해 Surface를 만든다(1대1).

    일반적으로 Activity가 Window를 가지고 있다.

  2. Surface

    화면에 합성되는 픽셀을 보유한 객체이다.

    Surface Flinger가 여러소스로 부터 그래픽 데이터 버퍼를 받고, 그것들을 합성하여 화면에 표시한다.

    보통 하나 이상의 버퍼를 가지고 있다. (이중 버퍼 렌더링)

  3. Canvas 모든 drawing 메소드를 가지고 있는 클래스로, 그리기에 대한 모든 로직을 가지고 있다.

    BItmap이나 openGL container 에 뷰를 그리는 도구 느낌

  4. View

    Window 내부에 있는 대화식 UI 요소로 단일 뷰 계층 구조로 연결되어 있다.

뷰가 그려지는 과정

Activity가 포커스를 받으면 레이아웃을 그리도록 요청한다. 이때 Activity에 레이아웃 계층 구조의 로트 노드를 제공해야 한다.

드로잉은 레이아웃의 루트 노드를 시작으로 전위순회 방식으로 진행된다(부모뷰 → 자식뷰). 즉 각 ViewGroup에서 각 하위요소를 그리도록 요청하고 각 View는 자체 그리기를 담당한다.

CustomView의 LifeCycle

뷰의 생명주기는 위와 같다.

레이아웃 그리기는 측정(measure) 단계, 레이아웃(layout) 단계, 그리기(draw) 단계로 이루어져있다.

Constructor

CustomView의 생성자로 코드를 통한 생성, xml을 통한 생성에 따라 파라미터가 달라진다.

onAttachedToWindow()

부모뷰가 addView()를 호출하면 해당 자식뷰가 Window에 붙고, id를 통해 접근할 수 있다.

Measure 단계