안드로이드에서 View 화면에 그려지기 위해 여러 단계를 거치며, 과정에서 중요한 콜백 메서드들이 호출됩니다. 과정은 크게 측정(Measure), 레이아웃(Layout), 그리기(Draw) 순서로 진행되며, 단계에서 호출되는 메서드들인 onMeasure(), onLayout(),

onDraw() 대해 설명드리겠습니다.

 

1. 측정 (Measure)

이 단계에서 뷰의 크기를 측정합니다. View가 얼마나 넓고 높을지를 결정합니다.

  • onMeasure(int widthMeasureSpec, int heightMeasureSpec):
    • 부모 뷰에서 자식 뷰에게 주어진 제약 조건(MeasureSpec)을 기반으로 자식 뷰가 자신의 크기를 결정하는 단계입니다.
    • widthMeasureSpec과 heightMeasureSpec은 부모 뷰로부터 전달된 제약 조건으로, 자식 뷰는 이 값을 참고하여 자신의 크기를 측정해야 합니다.
    • 이 메서드에서 setMeasuredDimension(int width, int height)을 호출하여 뷰의 최종 크기를 결정합니다.

2. 레이아웃 (Layout)

레이아웃 단계에서는 뷰의 위치를 결정합니다. 이 단계는 측정된 크기를 바탕으로, 각 뷰가 부모 뷰 안에서 어디에 위치할지를 정의합니다.

  • onLayout(boolean changed, int left, int top, int right, int bottom):
    • 이 메서드는 뷰의 자식들이 어떻게 배치될지(어떤 위치에 그릴지)를 결정합니다.
    • changed는 뷰의 크기나 위치가 변경되었는지를 나타내며, left, top, right, bottom은 부모 뷰 내에서 자식 뷰의 위치를 지정합니다.
    • 자식 뷰가 있다면, 이 메서드 내에서 각 자식 뷰의 layout() 메서드를 호출하여 자식 뷰들의 위치를 지정합니다.

3. 그리기 (Draw)

그리기 단계에서는 뷰가 실제로 화면에 그려집니다.

  • onDraw(Canvas canvas):
    • 이 메서드는 뷰의 콘텐츠를 그리는 작업을 합니다.
    • 이 메서드에서 주어진 Canvas 객체를 사용하여 텍스트, 이미지, 도형 등을 그릴 수 있습니다.
    • 일반적으로 onDraw()는 invalidate()나 requestLayout()이 호출될 때 트리거되며, 이는 뷰가 다시 그려져야 함을 나타냅니다.

뷰의 전체적인 그려지는 과정

  1. Measure 단계: 부모 뷰가 자식 뷰의 크기를 결정하기 위해 onMeasure()를 호출합니다. 이 단계에서 뷰의 크기가 결정됩니다.
  2. Layout 단계: 부모 뷰가 자식 뷰의 위치를 결정하기 위해 onLayout()을 호출합니다. 이 단계에서 뷰의 위치가 결정됩니다.
  3. Draw 단계: onDraw() 메서드가 호출되어 뷰의 실제 내용이 화면에 그려집니다.

이 과정은 여러 번 반복될 수 있으며, 특히 레이아웃이나 그리기 관련 변화가 생길 때마다 적절한 단계들이 재호출됩니다. 예를 들어, 뷰의 크기가 변경되면 onMeasure()와 onLayout()이 다시 호출되고, 뷰의 내용이 변경되면 onDraw()가 다시 호출됩니다.

 


 

안드로이드에서 View가 화면에 그려지기까지는 여러 단계의 콜백 메서드가 호출됩니다. 앞서 설명한 onMeasure(), onLayout(), onDraw() 외에도 중요한 메서드들이 존재하며, 이들은 각각의 역할을 수행하면서 뷰가 화면에 적절히 표시되도록 돕습니다. 전체적인 순서와 함께 추가적인 메서드들을 설명드리겠습니다.

전체적인 뷰 렌더링 과정과 주요 메서드들

  1. onFinishInflate()
    • 역할: XML 레이아웃 파일에서 뷰를 생성한 후 호출됩니다. 주로 뷰가 XML에서 정의된 후에 초기화 작업을 진행할 때 사용됩니다.
    • 타이밍: XML로부터 뷰가 생성된 후, 모든 하위 뷰들이 초기화된 후 호출됩니다.
  2. onAttachedToWindow()
    • 역할: 뷰가 윈도우(화면)에 부착될 때 호출됩니다. 이때부터 뷰는 윈도우에서 보여질 준비가 완료된 것입니다.
    • 타이밍: 뷰가 윈도우에 추가될 때 호출됩니다. 이 시점부터는 화면에 뷰가 나타날 수 있는 상태입니다.
    • 참고: 이 메서드는 보통 리소스 초기화 또는 리스너 등록 등의 작업에 사용됩니다.
  3. onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    • 역할: 뷰의 크기를 측정하는 단계로, 부모 뷰에서 주어진 MeasureSpec을 기준으로 뷰의 넓이와 높이를 결정합니다.
    • 타이밍: 뷰 그룹이 자식 뷰를 측정할 때, 그리고 뷰가 스스로의 크기를 결정할 때 호출됩니다.
  4. onSizeChanged(int w, int h, int oldw, int oldh)
    • 역할: 뷰의 크기가 변경될 때 호출됩니다. 주로 뷰의 크기가 변경될 때 필요한 작업을 처리할 때 사용됩니다.
    • 타이밍: 뷰의 크기가 변경될 때 onMeasure() 후에 호출됩니다.
    • 참고: 새 크기(w, h)와 이전 크기(oldw, oldh)를 비교하여 변경된 부분에 대해 추가 작업을 수행할 수 있습니다.
  5. onLayout(boolean changed, int left, int top, int right, int bottom)
    • 역할: 뷰의 위치를 결정하는 단계로, 뷰 그룹이 자식 뷰의 위치를 지정할 때 사용됩니다.
    • 타이밍: onMeasure() 이후, 뷰의 크기가 결정된 후 호출됩니다.
  6. onDraw(Canvas canvas)
    • 역할: 뷰의 내용을 그리는 단계로, Canvas를 사용해 텍스트, 이미지, 도형 등을 그립니다.
    • 타이밍: 뷰가 화면에 실제로 그려질 때 호출됩니다. 레이아웃이 완료된 후 실행됩니다.
  7. dispatchDraw(Canvas canvas)
    • 역할: 자식 뷰를 그리는 작업을 담당합니다. ViewGroup의 경우 onDraw()에서 호출되지 않은 자식 뷰의 그리기 작업이 이 메서드에서 처리됩니다.
    • 타이밍: onDraw() 이후, 자식 뷰가 있는 뷰 그룹에서 호출됩니다.
  8. onDetachedFromWindow()
    • 역할: 뷰가 윈도우에서 분리될 때 호출됩니다. 이 메서드에서는 리소스 해제나 리스너 제거와 같은 작업을 처리할 수 있습니다.
    • 타이밍: 뷰가 윈도우에서 제거될 때 호출됩니다.

뷰의 전체적인 순서 요약

  1. onFinishInflate(): XML에서 뷰가 완전히 생성된 후 호출.
  2. onAttachedToWindow(): 뷰가 윈도우에 부착될 때 호출.
  3. onMeasure(): 뷰의 크기를 측정.
  4. onSizeChanged(): 뷰의 크기가 변경될 때 호출.
  5. onLayout(): 뷰의 위치를 결정.
  6. onDraw(): 뷰의 내용을 그리기.
  7. dispatchDraw(): 자식 뷰의 그리기 작업을 처리.
  8. onDetachedFromWindow(): 뷰가 윈도우에서 분리될 때 호출.

이 모든 과정이 유기적으로 작동하여 뷰가 화면에 그려지고 사용자에게 표시됩니다. 각 단계에서 적절한 작업을 수행함으로써 효율적이고 원하는 대로 뷰를 화면에 표시할 수 있습니다.

 

 

 

무료 설치 - 많이 이용해 주세요

 

날씨위성영상 라이브 - (태풍 구름 눈 비 CCTV) - Google Play 앱

실시간으로 위성영상, 레이더영상을 확인하세요

play.google.com

 

 

 

안드로이드에서 View의 특정 메서드가 호출되면, 앞서 설명한 단계들 중 일부가 실행됩니다. invalidate(), requestLayout() 같은 메서드는 View의 다시 그리기, 크기 변경, 레이아웃 조정 등을 트리거합니다. 각 메서드가 어떤 콜백 메서드를 실행하게 되는지 설명드리겠습니다.

1. invalidate()

  • 설명: invalidate()는 뷰가 다시 그려져야 함을 시스템에 알립니다. 이 메서드를 호출하면 뷰의 onDraw() 메서드가 호출되어 뷰가 다시 그려집니다.
  • 트리거되는 메서드:
    • onDraw(): 뷰의 내용을 다시 그리기 위해 호출됩니다.
    • 참고: 이 메서드는 뷰의 레이아웃이나 크기에는 영향을 주지 않고, 오직 그리기만 다시 수행합니다.

2. requestLayout()

  • 설명: requestLayout()은 뷰의 레이아웃이 다시 계산되어야 함을 시스템에 요청합니다. 이 메서드를 호출하면 측정(Measure)과 레이아웃(Layout) 단계가 다시 수행됩니다.
  • 트리거되는 메서드:
    • onMeasure(): 뷰의 크기를 다시 측정하기 위해 호출됩니다.
    • onLayout(): 뷰의 위치를 다시 결정하기 위해 호출됩니다.
    • 참고: requestLayout()은 뷰의 레이아웃과 크기에 변화를 주고, 필요에 따라 onDraw()도 호출될 수 있습니다.

3. setVisibility(int visibility)

  • 설명: setVisibility()는 뷰의 가시성을 변경합니다(VISIBLE, INVISIBLE, GONE).
  • 트리거되는 메서드:
    • onMeasure() (GONE인 경우): GONE 상태로 설정하면 뷰가 레이아웃에 포함되지 않으므로 측정과 레이아웃 단계가 다시 호출될 수 있습니다.
    • onLayout(): 가시성에 따라 레이아웃이 변경될 수 있습니다.
    • onDraw(): INVISIBLE에서 VISIBLE로 변경된 경우, 뷰가 다시 그려집니다.

4. onAttachedToWindow()와 onDetachedFromWindow()

  • 설명: onAttachedToWindow()는 뷰가 윈도우에 부착될 때 호출되며, onDetachedFromWindow()는 윈도우에서 분리될 때 호출됩니다.
  • 트리거되는 메서드:
    • onMeasure(): 뷰가 처음 윈도우에 부착될 때 크기를 측정합니다.
    • onLayout(): 위치를 결정합니다.
    • onDraw(): 뷰를 그립니다.
    • onDetachedFromWindow(): 뷰가 윈도우에서 분리될 때 호출됩니다.

5. forceLayout()

  • 설명: forceLayout()은 뷰가 레이아웃을 강제로 다시 계산하도록 설정합니다. 이 메서드를 호출하면 다음 레이아웃 패스에서 반드시 onMeasure()와 onLayout()이 호출됩니다.
  • 트리거되는 메서드:
    • onMeasure(): 다음 레이아웃 패스에서 뷰의 크기를 다시 측정합니다.
    • onLayout(): 다음 레이아웃 패스에서 뷰의 위치를 다시 결정합니다.

6. setLayoutParams(ViewGroup.LayoutParams params)

  • 설명: setLayoutParams()는 뷰의 레이아웃 파라미터를 변경합니다. 이 메서드를 호출하면 뷰의 크기와 위치가 변경될 가능성이 있으므로 다시 레이아웃이 계산됩니다.
  • 트리거되는 메서드:
    • requestLayout(): 내부적으로 호출되어 레이아웃을 다시 요청합니다.
    • onMeasure(): 새로운 레이아웃 파라미터에 따라 크기를 다시 측정합니다.
    • onLayout(): 새로운 레이아웃 파라미터에 따라 위치를 다시 결정합니다.

7. invalidate(Rect dirty) 또는 invalidate(int l, int t, int r, int b)

  • 설명: 이 메서드는 특정 영역만 다시 그리도록 요청합니다. invalidate()와 유사하지만, 뷰 전체가 아니라 부분적으로 그리기 작업을 수행합니다.
  • 트리거되는 메서드:
    • onDraw(): 지정된 영역에 대해서만 뷰를 다시 그립니다.

8. layout(int l, int t, int r, int b)

  • 설명: layout() 메서드는 뷰의 위치를 수동으로 지정할 때 사용됩니다. 주로 커스텀 뷰에서 자식 뷰의 위치를 수동으로 설정할 때 호출됩니다.
  • 트리거되는 메서드:
    • onLayout(): layout() 메서드가 내부적으로 호출될 때 호출됩니다.

이 메서드들은 특정 상황에서 뷰의 그리기, 크기 측정, 레이아웃 위치 등을 조정하도록 트리거 역할을 합니다. 적절한 메서드를 사용하여 원하는 시점에 뷰를 다시 측정하거나 그리게 할 수 있습니다.

 

 

무료 설치 - 많이 이용해 주세요

 

전국 CCTV 지도(교통카메라지도) - Google Play 앱

고속도로 교통 카메라, 국도 교통 카메라, 즐겨찾기, 공공기관 관리 CCTV 위치를 지도에서 검색

play.google.com

 

+ Recent posts