2010년 7월 25일 일요일

안드로이드 UI 구현 - 화면 구성요소들의 계층구조

안드로이드 UI 구현 - 화면 구성요소들의 계층구조


안드로이드 애플리케이션의 가장 기본적인 기능 단위는 Activity(android.app.Activity 클래스의 객체)이다. Activity는 아주 많은 것을 할 수 있지만 Activity 그 자체만으로는 화면상에 아무것도 보여지지 않는다. Activity가 UI를 화면상에 나타내기 위해서는 안드로이드 플랫폼에서 사용자 인터페이스를 표현하는 기본 단위인 View와 ViewGroup과 함께 사용되어야 한다. 여기서는 각 화면 구성요소에 대한 간략한 설명을 하고, 추후에 필요에 따라 각 구성요소를 자세하게 설명하도록 하겠다.
 
(1) View
View는 android.view.View base 클래스의 객체이다. 이것은 화면상에서 특정한 직사각형 영역의 레이아웃과 내용을 저장하는 자료 구조이다. View 객체는 화면상의 특정 영역내에서 정렬, 레이아웃, 그리기, 포커스 이동, 스크롤링, 키 등을 다룬다.
View 클래스는 위젯(widget : 상호작용하는 화면 요소를 그리도록 구현된 서브 클래스를 말함)을 위한 base 클래스이다. 위젯은 자신만의 영역과 화면상에 보여지는 그래픽 요소를 가지고 있으며, 위젯을 이용하여 UI를 빠르게 만들어낼 수 있다. 위젯에는 Text, EditText, InputMethod, MovementMethod, Button, RadioButton, Checkbox, ScrollView 가 있다.
 
(2) ViewGroup
Viewgroup은 android.view.Viewgroup 클래스의 객체이다. 이 클래스의 이름이 말해주듯이 자신이 포함하는 하위의 View와 ViewGroup을 제어하는 기능을 가진 Composite 패턴의 특별한 View Object이다. Viewgroup은 UI의 구조를 만들어주고, 복잡한 화면 요소들을 만들어 하나의 엔티티로 취급할 수 있도록 한다. Viewgroup 클래스는 레이아웃(layout : 화면 레이아웃의 공통적인 틀을 제공할 수 있도록 구현된 클래스)의 base 클래스이다.
 
(3) Tree-Structured UI
안드로이드 플랫폼에서는 아래와 같은 다이어그램처럼 View와 Viewgroup 노드의 트리구조를 사용하여 Activity의 UI를 정의할 수 있다. 어떻게 구성하느냐에 따라 트리는 간단할 수도 복잡할 수도 있고, 안드로이드에서 제공하는 위젯과 레이아웃 또는 직접 제작한 view를 이용하여 이를 구성할 수 있다.
 
<그림1>

이러한 트리 구조를 화면상에 그려주기 위해서는 Activity가 setContent() 메소드를 호출하고 root 노드 객체를 이 메소드에 넘겨주면 된다. Activity가 활성화 되고 포커스를 받으면, 시스템은 Activity에 root 노드를 통해 화면상에 그리는 것을 요청하게 되며, root 노드는 하위의 노드를 그릴 것을 요청한다.
각 Viewgroup은 가용한 공간을 계산하고, 그 하위의 View를 배치하며 각 하위의 View에서 Draw() 메소드를 호출하여 스스로 그릴 수 있도록 한다. 각 하위의 View는 사이즈와 그려질 위치를 부모로부터 요청하며, 부모는 최종적으로 얼마나 크게, 어디에 그려질 수 있는가를 결정한다.
 
(4) LayoutParams: 어떻게 하위의 View가 위치와 사이즈를 결정하는가?
모든 Viewgroup 클래스는 ViewGroup.LayoutParams를 확장한 클래스를 이용한다. 이 서브클래스는 하위의 View 사이즈와 위치, Viewgorup 클래스의 특성들을 포함하고 있다.
모든 LayoutParmas의 서브클래스는 값을 설정하는 각자의 방법을 가지고 있다. 각 하위 요소들은 반드시 부모의 특징에 맞는 LayoutParams를 정의해야 한다.
 
<그림2>
모든 Viewgroup은 가로(width)와 세로(height), 마진(margin), 테두리(border)를 가지고 있으며 이를 사용자가 원하는 크기로 바꿀 수 있다.

 

 

 

 

[출처] http://www.kandroid.org/

 

 

댓글 없음:

댓글 쓰기