2008. 8. 7. 21:55

[Flex3] Grid 레이아웃 컨테이너 / Grid layout container

Reference : http://livedocs.adobe.com/flex/3/html/layouts_09.html

HTML 의 테이블처럼 컴포넌트를 셀의 행과 열로 배열하기 위해 Grid 레이아웃 컨테이너를 사용할 수 있다. 아래의 예제는 9개의 셀이 3x3 모양으로 배열된 Grid 컨테이너를 보여준다. :

Grid container with 9 cells

Grid 컨테이너의 각 셀은 한 개 이하의 컨테이너/컴포넌트를 가질 수 있다. 하나의 셀에 두 개 이상의 컴포넌트를 포함시키려면, 컨테이너를 셀에 넣고 그 컨테이너에 복수개의 컴포넌트를 추가해야 한다. 한 행에 있는 모든 셀의 높이는 같지만, 행마다 높이가 다를 수 있다. 한 열에 있는 셀의 폭도 모두 같지만, 각 열은 폭이 다를 수 있다.
 
Grid 컨테이너에서 행마다 열마다 셀의 개수를 다르게 정할 수 있다. 게다가 셀은 컨테이너에 있는 두 개 이상
의 행과 열에 속할 수 있다.

셀에 속하는 컴포넌트의 기본 크기나 명시적인 크기가 셀의 크기 보다 크면, 컴포넌트는 셀 가장자리에서 잘리게 된다.

셀에 속하는 컴포넌트의 기본 너비와 폭이 셀보다 작으면, 컴포넌트는 셀의 왼쪽 상단으로 정렬된다.셀에 속하는 컴포넌트의 위치를 제어하기 위해 <mx:GridItem> 태그의 horizontalAlign 과 verticalAlign 속성을 변경할 수 있다.

완전한 정보가 필요하면 Adobe Flex Language Reference 를 참조하라. 모든 셀이 같은 크기인 레이아웃을 생성하는 Tile 컨테이너에 대한 정보가 필요하면 Tile layout container 를 참조하라.

Creating a Grid layout container
Grid 레이아웃 컨테이너 생성

아래와 같이 Grid 레이아웃 컨테이너를 생성할 수 있다:

  • Grid 컨테이너를 정의하려면 <mx:Grid> 태그를 사용하면 된다. 이 태그는 여러 개의 <mx:GridRow> 태그를 가질 수 있다.
  • 각 행을 정의하려면 <mx:GridRow> 태그를 사용하면 된다. 이 태그는 반드시 <mx:Grid> 태그 내부에 정의되어야 하며 여러 개의 <mx:GridItem> 태그를 가질 수 있다. 
  • 행에 속하는 셀을 정의하려면 <mx:GridItem> 태그를 사용하면 된다. 이 태그는 반드시 <mx:GridRow> 태그 내부에 정의되어야 한다.

<mx:GridItem> 태그에서 아이템이 레이아웃되는 방법을 제어할 수 있는 속성이 있는데 아래와 같다:

속성

타입

사용

설명

rowSpan

Number

Property

셀이 몇 개의 행을 차지하고 있는지 나타냄. 초기값은 1.
Grid 컨테이너의 행 개수를 넘지 못함.

colSpan

Number

Property

셀이 몇 개의 열을 차지하고 있는지 나타냄. 초기값은 1.
Grid 컨테이너의 열 개수를 넘지 못함.

아래의 그림은 3개의 행과 3개의 열로 구성된 Grid 컨테이너를 보여준다:

Grid container with three rows and three columns

 Flash Player 에서 Grid 컨테이너는 왼쪽의 그림처럼 보여진다. 오른쪽 그림은 Grid 컨테이너에 행과 열을 표시한 것이다. 이 예에서 첫번째 행에 있는 버튼은 각 하나의 셀을 차지한다. 두 번째 행에 있는 버튼은 세 열을 차지하고 있고, 세 번째 있는 버튼은 두 번째 열과 세 번째 열을 차지하고 있다. 

아래의 이미지에서 보여주듯이, Grid 컨테이너에서 모든 행이 같은 개수의 셀을 갖도록 정의할 필요는 없다. Grid 컨테이너의 첫 번째 행에는 다섯 개의 셀이 정의되어 있고, 두 번째 행에는 세 개의 열을 차지하는 하나의 셀이 정의되어있다. 그리고 세 번째 행은 하나의 빈 셀과 두 셀의 공간을 차지하는 아이템이 정의되어 있다. .

The Grid container defines five cells in row one; row two has one item that spans three cells; and row 3 has one empty cell, followed by an item that spans two cells

아래의 MXML 코드는 이 섹션의 첫 그림에서 보여지는 것처럼 세 개의 행과 세 개의 열을 가진 Grid 컨테이너를 생성한다:

<?xml version="1.0"?>
<!-- containers\layouts\GridSimple.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Grid id="myGrid">

        <!-- 1행 정의 -->
        <mx:GridRow id="row1">
            <!-- 1행의 첫 번째 셀 정의 -->
            <mx:GridItem>
                <mx:Button label="Button 1"/>
            </mx:GridItem>
            <!-- 1 행의 두 번째 셀 정의 -->
            <mx:GridItem>
                <mx:Button label="2"/>
            </mx:GridItem>
            <!-- 1 행의 세 번째 셀 정의 -->
            <mx:GridItem>
                <mx:Button label="Button 3"/>
            </mx:GridItem>
        </mx:GridRow>

        <!-- 2행 정의 -->
        <mx:GridRow id="row2">
            <!-- 2 행의 세 열의 공간을 차지하는 한 셀을 정의 -->
            <mx:GridItem colSpan="3" horizontalAlign="center">
                <mx:Button label="Long-Named Button 4"/>
            </mx:GridItem>
        </mx:GridRow>

        <!-- 3행 정의 -->
        <mx:GridRow id="row3">
            <!-- 3행의 첫 셀 정의 -->
            <mx:GridItem/>
            <!-- 3 행의 2열과 3열의 공간을 차지하는 셀 정의 -->
            <mx:GridItem colSpan="2" horizontalAlign="center">
                <mx:Button label="Button 5"/>
            </mx:GridItem>
        </mx:GridRow>

    </mx:Grid>
</mx:Application>

이 예제의 SWF 파일을 실행하면 아래와 같이 보인다:

위의 예제를 첫 번째 행이 다섯 개의 버튼을 포함하게 하려면 처음의  <mx:GridRow> 태그를 아래처럼 수정해야 할 것이다:

<?xml version="1.0"?> <!-- containers\layouts\Grid5Button.mxml --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Grid id="myGrid"> <!-- 1행 정의 --> <mx:GridRow id="row1"> <!-- 1행의 첫 번째 셀 정의 --> <mx:GridItem> <mx:Button label="Button 1"/> </mx:GridItem> <mx:GridItem> <mx:Button label="2"/> </mx:GridItem> <mx:GridItem> <mx:Button label="Button 3"/> </mx:GridItem> <mx:GridItem> <mx:Button label="Button 3a"/> </mx:GridItem> <mx:GridItem> <mx:Button label="Button 3b"/> </mx:GridItem> </mx:GridRow> <!-- 2행 정의 --> <mx:GridRow id="row2"> <!-- 2행의 세 열의 공간을 차지하는 하나의 셀 정의 --> <mx:GridItem colSpan="3" horizontalAlign="center"> <mx:Button label="Long-Named Button 4"/> </mx:GridItem> </mx:GridRow> <!-- 3행 정의 --> <mx:GridRow id="row3"> <!-- 3행의 첫 번째 셀 정의 --> <mx:GridItem/> <!-- 3행의 2열과 3열의 공간을 차지하는 셀 정의 --> <mx:GridItem colSpan="2" horizontalAlign="center"> <mx:Button label="Button 5"/> </mx:GridItem> </mx:GridRow> </mx:Grid> </mx:Application>



이 예제의 SWF 파일을 실행하면 아래와 같이 보인다:

Setting the row and column span
row span과 column span 설정

 GridItem 컨테이너의 colSpan 속성과 rowSpan 속성을 통해 몇 개의 행이나 열을 차지하는 그리드 아이템을 생성할 수 있다. 하나의 아이템이 둘 이상의 행이나 열을 차지하도록 하는 것이 반드시 아이템에 속하는 컨트롤/컨테이너를 크게 만드는 것은 아니다. Making an item span multiple rows or columns does not necessarily make its child control or container larger; you must size the child so it fits the space appropriately, as the following example shows.

아래의 이미지는 Creating a Grid layout container 의 예제를 Button 3a 가 두 행을 차지하도록, Button 3b 가 세 행을 차지하도록, Button 5 가 세 열을 차지하도록 수정한 것이다:

The Grid container where Button 3a spans two rows, Button 3b spans three rows, and Button 5 spans three column

이 결과를 만들기 위해 수정된 코드는 아래와 같다:

<?xml version="1.0"?>
<!-- containers\layouts\GridRowSpan.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Grid id="myGrid">

        <!-- 1행 정의 -->
        <mx:GridRow id="row1" height="33%">
            <!-- 1 행의 첫 셀 정의 -->
            <mx:GridItem>
                <mx:Button label="Button 1"/>
            </mx:GridItem>
            <mx:GridItem>
                <mx:Button label="2"/>
            </mx:GridItem>
            <mx:GridItem>
                <mx:Button label="Button 3"/>
            </mx:GridItem>
            <mx:GridItem rowSpan="2">
                <mx:Button label="Button 3a" height="100%"/>
            </mx:GridItem>
            <mx:GridItem rowSpan="3">
                <mx:Button label="Button 3b" height="100%"/>
            </mx:GridItem>
        </mx:GridRow>
       
        <!-- 2 행 정의 -->
        <mx:GridRow id="row2" height="33%">
            <!-- 2 행에서 세 열의 공간을 차지하는 하나의 셀 정의 -->
            <mx:GridItem colSpan="3" horizontalAlign="center">
                <mx:Button label="Long-Named Button 4"/>
            </mx:GridItem>
        </mx:GridRow>

        <!-- 3 행 정의 -->
        <mx:GridRow id="row3" height="33%">
            <!-- 3 행의 첫 셀 정의 -->
            <mx:GridItem/>
            <!-- 3 행에서 2,3,4 열의 공간을 차지하는 셀 정의 -->
            <mx:GridItem colSpan="3">
                <mx:Button
                    label="Button 5 expands across 3 columns"
                    width="75%"/>
            </mx:GridItem>
        </mx:GridRow>

    </mx:Grid>
</mx:Application>

이 예제에 대한 SWF 파일을 실행하면 아래의 화면처럼 보여진다 :

이 예제는 아래와 같은 효과를 만들었다:

  • 각 행의 높이를 그리드의 33%로 정하여, 모든 행의 높이가 같게 했다.
  • Button 3a 와 3b 가 두 행과 세 행의 공간을 차지하도록 아이템의 rowSpan 속성을 정했다.
  • Button 3a 와 3b 가 차지하는 행을 모두 칠하도록 height 속성을 100%로 정했다. 버튼의 이 속성을 생략하면, Flex 는 버튼의 높이를 변경하지 않기 때문에 여러 행의 공간을 차지하는 모습을 볼 수 없을 것이다.
  • Button 5 가 세 열의 영역을 차지하도록 정했고, 가로 길이를 75%로 정했다. 이 예제에서 텍스트는 필요한 만큼 버튼의 가로 길이가 늘어날 것을 요구한다. 그래서 Flex 는 75%가 아니라, 텍스트에 맞춰 버튼의 가로 길이를 정했다. width 속성을 생략하더라도 같은 결과를 얻을 수 있다. 가로 길이를 퍼센트로 정하는 효과를 보고 싶다면, 라벨 텍스트를 줄여라. 버튼이 3 열의 3/4만 차지하는 것을 볼 수 있을 것이다.

이 외에도 마지막 그리드는 몇 개의 특징을 더 갖고 있다.두 번째 행의 정의가 단 하나의 <mx:GridItem> 태그로 나타나더라도, Flex 는 자동으로 Button 3a와 Button 3b 를 위한 두 개의 셀을 추가한다. 세 번째 행에도 다섯 개의 셀이 있다. 첫 번째 셀은 빈 <mx:gridItem/> 태그로 정의되었다. 두 번째에서 네 번째 셀은 Button 5를 담고 있는  GridItem 으로 정의되었다. 첫 번째 행의 마지막 아이템이 세 행의 영역을 차지하고 있기 때문에 다섯 번째 열이 만들어졌다.