Flex_布局和容器

1、Halo组件也称MX组件,是Flex3的独有组件(按钮、文本字段、容器等)。而Flex4引入了新一代的组件,称为Spark。
   Flex4同时支持Halo和Spark。但是很多Halo组件都有更新的Spark组件。

2、布局种类
Spark都支持下面的任何一种布局:
  - BasicLayout:绝对布局。使用x,y坐标。
  - HorizontalLayout:单行中横向排列。
  - VerticalLayout:单列纵向排列。
  - TileLayout:网格形式显示组件,创建尽可能多的行和列。

3、绝对布局
绝对布局,使用x,y坐标,允许控制元素的确切位置和大小。
容器的左上角代表坐标原点(0,0)。(Flex中,x坐标从左边开始;y坐标,从顶部开始。)
Application容器默认使用绝对布局。

x,y坐标为负值时,组件会移到视觉范围外。

4、基于约束的布局
在难以确定组件的精确坐标时,可以用绝对布局模式中基于约束的布局方式。基于约束的布局是相对于容器的4个边或容器的中心点来定位组件。
  - 4个边: top,bottom,left,right
  - 中心点: horizontalCenter,verticalCenter
  - baseline:组件的上边与容器的距离
优点是,即使调整窗口大小也可以保持组件的相对位置不变。

5、增强的约束布局(Spark容器不支持,Spark组件支持)
可以在水平和垂直方向上任意创建隐藏的辅助线,然后基于辅助线定位组件。
约束行和约束列的设定(<mx:constraintColumns> <mx:constraintRows>):
  - 固定约束: 由绝对数字(像素)来指定
  - 相对约束: 根据容器大小的百分比来确定
  - 内容大小约束: 约束行和约束列将和最大项目的大小相同

Halo的Canvas容器支持增强约束,Spark容器不支持增强约束,但是Spark组件可以放到Halo容器中。

6、自动布局
   自动布局模式下,是将容器定向到位置元素中。
   1)使用布局类
      Spark容器有4种布局类,其中BasicLayout是绝对布局,其它下面三种则提供了自动布局选项:
        - HorizontalLayout
        - VerticalLayout
        - TileLayout  (自动网格布局)

   2)使用空间
      <mx:Spacer/>组件可以在布局类指定的方向上,使组件隔开相对的距离。
      例: <mx:Spacer width=”50%”>      // 使组件平均地分开相对距离

7、容器
   1)Application
      一个应用程序只能有一个,是根容器。
      有个特色属性preloader,是启动Flex程序时的进度条。默认是On的,可以Off。
      可以装载全局变量和函数。

   2)Canvas
      是一种最基本的容器,是Halo组件。在增强约束时使用。

   3)Group
      是一个简单容器,和布局类结合使用,默认BasicLayout布局。
      子容器有Hgroup和Vgroup。

   4)SkinnableContainer
      类似Group,支持换肤。

   5)Panel
      基于SkinnableContainer,特点在于添加了一个标题栏和一个框架,并默认给子对象绘制边框。
      默认使用BasicLayout。

   6)ApplicationControlBar
      给程序添加了控制栏,和File菜单类似。要和Application容器结合使用。
      (ControlBar和它类似,但是效果不好,避免)

   7)DataGroup
      用于分组数据,可以使用项渲染器渲染数据,从而自定义显示。默认是BasicLayout。
      需要将数据发送给DataGroup的dataProvider。
      为了显示数据,可以使用如下渲染器:
        - spark.skins.spark.DefaultItemRenderer:显示为简单文本
        - spark.skins.spark.DefaultComplexItemRenderer:显示为Group容器内的组件。只有当数据包含视觉组件时才有效。

   8) SkinnableDataContainer
      类似DataGroup,支持换肤.

   9)DividedBox、HDividedBox、VDividedBox
      这些是Halo组件,他们允许控制大小的调整。
      DividedBox支持通过direction属性设置水平和垂直布局方式。
      HDividedBox是水平布局,VDividedBox是垂直布局。

   10)Form
      方便布局表单,纯粹是布局目的。
      它包含三个标签
        - Form:主容器
        - FormHeader:可选,添加标题用
        - FormItem:将文本与每个表单输入字段关联

   11)Grid
      类似HTML的表,顶级的Grid标签用于标识网格的开始,GridRow用于插入行,GridItem用于向网格中输入数据。

   下面是使用容器的简单代码(所用到的Skin代码就省略了,FB默认做成的就行): 

<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 

               xmlns:s="library://ns.adobe.com/flex/spark" 

               xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>

        <![CDATA[

            import flash.events.Event;

            import mx.controls.Alert;

            

            import mx.collections.ArrayCollection;

            

            private function clickHandler2(evt:Event):void 

            {

                Alert.show("Do you want to save your changes?", "Save Changes", Alert.YES|Alert.NO, this);

            }

            

            [Bindable]

            public var somedata:ArrayCollection= new ArrayCollection(["one", "two", "three"]);

            

        ]]>

    </fx:Script>



    <fx:Declarations>

        <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 -->



    </fx:Declarations>

    

    <mx:Canvas width="100%" height="100%">

        <mx:constraintColumns>

            <s:ConstraintColumn id="col1" width="40%"/>

            <s:ConstraintColumn id="col2" width="60%"/>

        </mx:constraintColumns>

        

        <s:Button label="btn 1" left="col1:10" right="col1:10" top="100"/>

        <s:Button label="btn 2" left="col2:10" right="col2:10" top="60"/>

        

    </mx:Canvas>



    <!-- SkinnableContainer sample -->

    <s:SkinnableContainer skinClass="helloSkin">

        <s:layout>

            <s:HorizontalLayout/>

        </s:layout>

        

        <s:Button label="btn skin 1"/>

        <s:ScrubBar width="100" height="10"/>

    </s:SkinnableContainer>

          

    <!-- ApplicationControlBar sample -->

    <mx:ApplicationControlBar width="80%" top="200">

        <s:Button label="appCtlBar Back"/>

        <s:Button label="appCtlBar Forward" color="0x00ff55"/>

        <s:TextInput width="50"/>

        <s:Button label="Search"/>

    </mx:ApplicationControlBar>



    <!-- DataGroup sample -->

    <s:DataGroup dataProvider="{somedata}" itemRenderer="spark.skins.spark.DefaultItemRenderer" top="300">

        <s:layout>

            <s:HorizontalLayout/>

        </s:layout>

    </s:DataGroup>



    <!-- Form sample -->

    <mx:Form top="400">

        <mx:FormHeading label="Form head info"/>

        <mx:FormItem label="First Name">

            <s:TextInput/>

        </mx:FormItem>

        <mx:FormItem label="Last Name">

            <s:TextInput/>

        </mx:FormItem>

    </mx:Form>



    <!-- Grid sample -->

    <mx:Grid top="600" left="10">

        <mx:GridRow>

            <mx:GridItem>

                <s:Button label="Rewind"/>

            </mx:GridItem>

            <mx:GridItem>

                <s:Button label="Play"/>

            </mx:GridItem>

            <!--

            <mx:GridItem>

                <s:Button label="Forward"/>

            </mx:GridItem>

            -->

        </mx:GridRow>

        <mx:GridRow>

            <mx:GridItem colSpan="2">

                <s:Button label="Stop" width="100%"/>

            </mx:GridItem>

        </mx:GridRow>

    </mx:Grid>

</s:Application>
layout.mxml


8、皮肤
   皮肤文件有两条基本规则:
     - 必须支持组件可能有的所有状态
     - 必须在名为contentGroup的皮肤内定义一个额外的容器

你可能感兴趣的:(Flex)