[안드로이드] 뷰가 그려지는 과정
- 프로그래밍 정보
- 2010. 10. 4.
반응형
읽기전에 손가락 한번 클릭~ >_<
고마워요 ~ Chu ~ ♥
안드로이드의 레이아웃에 관한 글입니다.
안드로이드에서 뷰가 그려지는 과정
안드로이드에서의 액티비티가 포커스를 얻으면 자신의 레이아웃을 그리도록 요청이 됩니다.
이때 액티비티에 레이아웃의 계층구조 중 루트(root) 노드를 제공해야 합니다.
그리기는 레이아웃의 루트 노드에서 시작됩니다. 그리고 레이아웃 트리를 따라 이동해 가면서 그려지게 되지요.
순서대로 각 뷰 그룹은 그것의 자식들 각각이 그려지도록 하며, 각 뷰는 스스로를 그리게 됩니다.
중요한 점은 트리를 따라 그려지기 때문에 부모가 자식들 이전에 그려지고, 형제들은 트리에 나타난 순서대로 그려진다는 점입니다.
레이아웃을 그리는 과정은 측정순서 와 레이아웃 순서 라는 두번의 과정을 거치게 됩니다
측정 순서는 measure(int, int) 메소드에서 구현되며, 뷰 트리를 위에서 아래로 경유하면서 진행이 됩니다.측정순서가 끝나면 모든 뷰는 뷰에서 필요한 크기에 대해 저장을 합니다.
두번째 순서는 layout(int, int, int, int) 메소드에서 일어나며, 역시 위에서 아래로 경유하며 진행됩니다. 이 순서 동안 부모는 측정된 크기를 사용하여 자식뷰들 모두의 위치를 정합니다.
결국엔 뷰의 measure() 메소드가 리턴될 때, 그것의 getMeasuredWidth() 메소드와 getMeasuredHeight() 메소드의 값은 그 뷰의 자식들의 값들과 함께 설정된다고 합니다.
이것이 바로 측정된 너비와 높이값을 나타냅니다.
측정된 너비와 높이는 부모에 의해 지정된 값을 전적으로 따르게 됩니다. 즉, 측정 순서가 끝나면 부모는 자식들의 크기를 포함할 수 있는 상태라고 볼 수 있습니다.
부모 뷰가 자식들에게 한번 이상의 measure() 메소드를 호출할 수도 있는데, 예를들어 부모가 자식들 각각의 크기를 먼저 측정한 뒤, 자식들 크기의 합이 너무 크거나, 너무 작다면 다시 measure() 메소드를 호출해야 되겠지요.
측정 순서는 크기 전달을 위해 두개의 클래스를 사용합니다.
View.MeasureSpec 클래스는 측정과 배치를 원하는 부모에게 알려주는 역할을 합니다.
LayoutParams 클래스는 뷰가 얼마나 크게 되고 싶은지를 나타내는 역할을 합니다.
각각의 크기는 다음와 같이 지정됩니다.
▣ 정확한 값
▣ 뷰가 부모의 크기만큼 꽉 채우기 ( FILL_PARENT )
▣ 뷰가 자신의 내용을 감쌀만큼만의 크기를 원할 때 ( WRAP_CONTENT )
뷰 그룹의 서브클래스에 LayoutParams 의 서브클래스가 있는 경우
제목이 좀 길고 어렵습니다^^;
일단 뷰 그룹의 서브클래스에 LayoutParams 의 서브클래스가 있는 경우가 있을 수 있습니다.
예를들어 랠러티브 레이아웃은 자신의 LayoutParams 서브클래스를 가지는데요, 이것은 자식뷰를 가로세로 가운데에 놓는 처리를 합니다.
MeasureSpec 은 부모에서 자식으로, 트리 아래로 요구조건을 보내기 위해 사용됩니다.
아래의 세가지 모드 중 하나를 가집니다.
▣ UNSPECIFIED : 자식뷰가 원하는 크기 결정을 위해 부모에 의해 사용됨. 예를들어 자식뷰의 너비가 240 이라면, 원하는 높이를 알기 위해 , UNSPECIFIED 로 설정된 높이와 EXACTLY 240 으로 설정된 너비를 가지고 자식 뷰에 대한 measure() 메소드를 호출할 수 있습니다.
▣ EXACTLY : 자식에게 정확한 크기 부여를 위해 부모에 의해 사용됨. 자식은 이 크기를 사용해야되고, 자식의 자식(자손:decendants) 은 이 크기안에서 맞춰져야 합니다.
▣ AT_MOST : 자식에게 최대 크기 부여를 위해 부모에 의해 사용됨. 자식과 자손은 이 크기 안에서 맞춰져야 합니다.
일반적인 안드로이드의 레이아웃에 관한 글 이었습니다.
레이아웃에 대한 내용도 이제 끝이네요 ^^
다음 글은 리소스.........ㅋㅋ
관련글
[안드로이드] 안드로이드 레이아웃
[안드로이드] 스타일과 테마 적용하기
[안드로이드] 레이아웃 선언하기
[안드로이드] 레이아웃 리소스 ID 선언
[안드로이드] 레이아웃 뷰의 위치
[안드로이드] UI 레이아웃과 위젯
[안드로이드] 스타일과 테마 적용하기
[안드로이드] 레이아웃 선언하기
[안드로이드] 레이아웃 리소스 ID 선언
[안드로이드] 레이아웃 뷰의 위치
[안드로이드] UI 레이아웃과 위젯
반응형