使用Flex4容器若干技巧
本文适用于正在寻找使用Flex 4容器和布局的快速参考指南的开发人员。 尽管这不一定是一个复杂问题,但这似乎是许多开发人员的挫折的来源,特别是对于那些Flex刚刚入门的开发人员。 当开发人员不知道如何正确使用容器和布局时,他们的代码常常包含过多的嵌套容器和大量毫无意义的属性。
Flex 容器基本概念
Flex 4 容器可以提供一套默认的布局:Basic、Horizontal或 Vertical以及能够基于容器内容的默认尺寸。 当进行子组件对齐操作时,注意你正在使用的容器的最小和默认尺寸。参见表 1。有些容器是可植皮的,如果真是如此,则通过在它们的皮肤上添加Spark Scroller对它们进行滚动操作。
注意Basic 布局等同于 Flex 3的绝对布局(absolute layout )。
此外,还应该注意 Spark 容器支持包含形状和FXG元素的 GraphicElement对象以及作为直接子组件的IVisualElement对象 UI 控件。 但并不是所有的MX容器均是这种情形。
表 1. Spark容器
名称 |
最小尺寸 |
默认尺寸 |
默认布局 |
皮肤? |
滚动条 |
注释 |
---|---|---|---|---|---|---|
Group |
0x0 |
Content |
Basic |
包含于Scroller |
与Box相似但没有skin/chrome |
|
HGroup |
0x0 |
Content |
Horizontal |
包含于Scroller |
水平对齐条目;与Vbox相似但没有skin |
|
VGroup |
0x0 |
Content |
Vertical |
包含于Scroller |
垂直对齐条目;与Vbox相似但没有skin |
|
DataGroup |
0x0 |
Content |
Basic |
包含于Scroller |
携带一个数据提供者和条目渲染器 |
|
SkinnableContainer |
0x0 |
Content |
Basic |
X |
添加至skin |
包含式样属性 |
BorderContainer |
112x112 |
112x112 |
Basic |
X |
添加至skin |
包含式样属性 |
Panel |
131x127 |
Content |
Basic |
X |
添加至skin |
包含标题条 |
Application |
0x0 |
375x500 or all space in browser |
Basic |
X |
添加至skin |
Web应用程序 |
NavigatorContent |
0x0 |
Content |
Basic |
X |
添加至skin |
用于导航容器 |
Window |
0x0 |
100x100 |
Basic |
X |
添加至skin |
只用于AIR |
WindowedApplication |
OS/chrome-specific |
100x375 |
Basic |
X |
添加至skin |
只用于AIR |
在默认情形下,当你利用Flash Builder创建一个web应用程序,它将分别具有955 和600 的最小宽度和最小高度。 你可以在Flash Builder 中通过从File Template中删除minSize
变量来改变这一设置。
- 在Flash Builder中,选择Flash Builder > Preferences。
- 展开Flash Builder 并且选择 File Templates。
- 点击MXML Web Application 将其作为 File Type。参见图 1。
- 点击Edit并且删除
${min_size}
。 - 点击OK两次。

有些容器能够支持嵌套 layout
标签以覆盖表1中所示的 默认布局,它们仅仅包含作为子组件的 layout
标签。 允许你进行布局嵌套的容器包括Application、BorderContainer、Group、Panel和SkinnableContainer。
布局形象化和布局属性
通常,如果一个概念能够栩栩如生地展现出来,则它易于快速地被人们接受—正如谚语所言:一副图画胜过千言万语。 Justin Shacklette和 Gilles Guillemin是 FlexLayouts.org的拥有者,他们已经画出三幅对说明Flex 4的HorizonalLayout (参见图 2) 、Vertical Layout (参见图 3)以及TileLayout (参见图 4)很有帮助的示意图。他们还展示了如何应用属性,例如填充(paddingLeft
)、对齐(horizontalAlign
) 以及gap
等。 你可以下载这些查看PDF。 请在下载之后欣赏他们这些令人叫绝的自定义Flex 4布局。

图2. Flex 4的HorizontalLayout

图3. Flex 4的VerticalLayout

图4. Flex 4的TileLayout
Group容器滚动
在Flex 3中,滚动功能内置于组件;而在 Flex 4中,该功能的实现方式不同。 因此,在 Flex 3和 Flex 4组件中,在如何处理滚动操作方面存在显著差异。 对Group 容器以及 Hgroup、Vgroup和 DataGroup 容器进行滚动操作的最佳方法是在一个Spark Scroller对象中包装容器。 关键之处是将Scroller的宽度和高度设置为你希望查看内容的尺寸。 你也可以设置滚动位置以便在相应范围的当前位置显示内容。 如果你没有设置宽度和高度,或将它们设置为大于内容的值,则滚动条将不会出现。 例如,考虑下列代码,它的任务是将Scroller的宽度和高度设置为图像的尺寸。
<?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" minWidth="955" minHeight="600"> <s:Scroller width="300" height="300"> <s:Group> <mx:Image width="300" height="300" source="@Embed(source='logo.png')"/> </s:Group> </s:Scroller> </s:Application>
假如从Scroller对象中完全删除 width
和 height
,则滚动条不会显示出来。参见图5。

下列代码将显示具有水平滚动条的图像的左半部分,允许用户滚动到图像的另一半部分。参见图6。由于Scroller高度被默认设置为内容高度,故垂直滚动条将不会添加:
<?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" minWidth="955" minHeight="600"> <s:Scroller width="150"> <s:Group> <mx:Image width="300" height="300" source="@Embed(source='logo.png')"/> </s:Group> </s:Scroller> </s:Application>

图6. 由于Scroller高度被设置为内容高度,导致垂直滚动条不可见
可植皮容器滚动
对于可植皮的容器,其中包括 Spark Application、BorderContainer、 NavigatorContent、Panel和 Window,你应该将Scroller对象添加到围绕 contentGroup
Group对象的skin类。 例如,下面是来自一个自定义SkinnableContainer MXML 皮肤的相关代码:
<s:Scroller width="100%" height="100%"> <s:Group id="contentGroup" minWidth="0" minHeight="0" /> </s:Scroller>
另一个可选方法是在你的代码中将包围你的内容的Scroller和 Group作为第一个子组件进行嵌套。 然而,首选方法是在skin类中保持Scroller的独立状态。 关于滚动和容器的更多详细信息,参见 在 Spark容器中添加滚动条。
布局指南
下面是我在使用容器时遵循的若干指南:
- 如果对象的容器具有基本或绝对布局,则可以使用限制条件--例如
left
、right
、top
、bottom
、horizontalCenter
和verticalCenter
来确定其位置。 - 如果容器拥有具有
layout
标签或通过使用Hgroup或 Vgroup获得的 垂直或水平布局,则可以使用horizontalAlign
、verticalAlign
、gap
、paddingTop
、paddingBottom
、paddingLeft
和paddingRight
属性来控制子组件以及包围它们的空白符。 这些属性不能用于基本或绝对布局。参见表2。
表 2. 布局属性小结
布局场景 |
在自身对象中使用属性 |
在父容器中使用属性 |
||
---|---|---|---|---|
位于BasicLayout 绝对容器中的对象 |
Left, right, top, bottom |
horizontalCenter, verticalCenter |
||
位于Vertical、Horizontal或 TileLayout 容器中的对象 |
paddingLeft, paddingRight, paddingTop, paddingBottom |
horizontalAlign, verticalAlign |
<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"> <s:layout> <s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/> </s:layout> <!-- Container 1 has a BasicLayout (default) and uses constraints on the label itself for placement --> <s:SkinnableContainer id="c1" backgroundColor="0x000000" color="0xFFFFFF" width="420" height="200"> <s:Label horizontalCenter="0" top="30" text="Basic Layout using constraints on the object itself for layout."/> </s:SkinnableContainer> <!-- Container 2 has a VerticalLayout with align and padding properties set on it for label placement --> <s:SkinnableContainer id="c2" backgroundColor="0x000000" color="0xFFFFFF" width="420" height="200" > <s:layout> <s:VerticalLayout horizontalAlign="center" paddingTop="30"/> </s:layout> <s:Label text="VerticalLayout that specifies where the label is placed with properties."/> </s:SkinnableContainer> </s:Application>

- 如果希望利用水平或垂直布局在一个容器中将子组件定位在中央位置或利用 Hgroup或 VGroup将子组件定位在中央位置,则可以使用
horizontalAlign="center"
和verticalAlign="middle"
。 - 如果希望在一个具有基本或绝对布局的容器中将一个组件定位在中央位置,可以在需要定位在中央位置的组件中使用
horizontalCenter="0"
和verticalCenter="0"
。
下面两个代码范例使用不同技巧将一个对象定位在中央位置,它们产生的结果是相同的。
第一个范例(参见图 8)使用 horizontalAlign="center"
和 verticalAlign="middle"
:
<?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"> <s:layout> <s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/> </s:layout> <s:BorderContainer borderColor="red" borderWeight="5" width="300" height="300"/> </s:Application>

第二个范例(参见图 9)使用 horizontalCenter="0"
和 verticalCenter="0"
:
<?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"> <s:BorderContainer borderColor="red" borderWeight="5" width="300" height="300" horizontalCenter="0" verticalCenter="0"/> </s:Application>

图9.使用 horizontalCenter="0" 和 verticalCenter="0"对红色正方形进行定位
通用技巧
最后,给出需要牢记的若干通用技巧:
- 总体来说, 应该选择使用限制条件 而不选择具有(x,y)值的绝对定位方式,因为限制条件可以动态地调整浏览器的大小。 当为web、桌面、手机和平板电脑设备开发跨平台的应用程序时,这一点更为重要,因为这些设备的屏幕尺寸变化较大。
- 一般来说,可以将
left/right
用于大小调整目的,而将horizontalCenter
和verticalCenter
用于定位目的。 - 对于一般居中定位目的,特别是当启动最小尺寸窗口并且你希望对一个对象进行居中定位时,可以使用horizontalCenter。
注: 当不知使用哪个属性时,切换至 Design视图,以便在Property检查工具中查看哪些选项可以使用。 在Design视图中显示的属性将能够根据选择的组件和容器的布局进行切换。 这是一种仔细检查你正在执行的任务的很好的方式。
使用Flex4容器若干技巧的更多相关文章
- Go 若干技巧
此文来自 http://denvergophers.com/2013-09/tips-and-tricks.slide ###本文主要涉及到: 1. formatting 技巧 2. 异常处理技巧 3 ...
- Excel 2007 若干技巧。
1.自定义序列 office按钮→excel选项→常用→编辑自定义列表 2.无法清空剪贴板错误的处理办法: 取消"显示粘贴选项"选项 3.每次选定同一单元格 输入后按ctrl+En ...
- 盘点Linux内核源码中使用宏定义的若干技巧(1)
http://blog.chinaunix.net/uid-23769728-id-3141515.html
- VS2013日常使用若干技巧+快捷键
1.注释的方法 1)sqlserver中,单行注释:— — 多行注释:/* 代码 */ 2)C#中,单行注释:// 多行注释:/* 代码 */ 3)C#中多行注释的快捷方式:先选中你要注 ...
- Flex移动应用程序开发的技巧和窍门(一)
这是一个由多个部分组成的系列文章的第一部分,它包含了Flex移动开发的若干技巧.如果你过去习惯于桌面和Web编程,你会发现,开发移动应用程序将面临一系列新的挑战. 除了重新思考你的对数据存储和处理的策 ...
- 为什么不建议把数据库部署在Docker容器内?
近2年Docker非常的火热,各位开发者恨不得把所有的应用.软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗?这个问题不是子虚乌有,因为在网上能够找到很多各种操作手册和视频教程, ...
- 面试官:我把数据库部署在Docker容器内,你觉得如何?
开源Linux 一个执着于技术的公众号 上一篇:CentOS 7上搭建Zabbix4.0 近2年Docker非常的火热,各位开发者恨不得把所有的应用.软件都部署在Docker容器中,但是您确定也要把数 ...
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...
- 使用 ServiceStack 构建跨平台 Web 服务
本文主要来自MSDN杂志<Building Cross-Platform Web Services with ServiceStack>,Windows Communication Fou ...
随机推荐
- mysql触发器之姓名转姓名拼音
人员表people 字段:id,peopleNumber,name,namePinyin,sex,birthday,nation. namePinyin不用填写,根据name自动生成. wordlib ...
- 如何给对话框中的控件发送消息呢?Windows消息分类
以博文CTabCtrl中介绍的那样,给Tab添加子对话框来显示Tab内容.那么如果这个子对话框中含有个CTreeCtrl控件,有个Button控件,我想要模拟给这两个控件发送消息,该怎么办呢?直接把给 ...
- json转义字符串
json前台写数据 @RequestMapping("/addUserJson") public void addUserJson(User user,HttpServletReq ...
- String类的两种赋值
java.lang包是java的默认引入包,所以我们不需显式地导包. String s1 = new String("字符串");//创建2个字符串对象,堆中一个,字符串常量池中一 ...
- BP神经网络的Java实现
http://fantasticinblur.iteye.com/blog/1465497
- 使用SQLServer2005插入一条数据时返回当前插入数据的ID
使用SQLServer2005插入一条数据时返回当前插入数据的ID 在执行完插入后 再执行 select @@identity from users 就OK 就是刚才插入的那行的 ID了 补充: @@ ...
- ubuntu 开启 ftp 服务 | mingming-killer
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- Cocos2dx 3.1.1 学习笔记整理(4):事件监听与Action的初步使用
项目忙,趁着刚才有点空,看了下触摸事件在新版本中怎么实现,遇到问题都是去:cocos2d-x-3.1.1\tests\cpp-tests\Classes下面找的,里面都是一些小例子. 首先新的CCNo ...
- HUST 1027 Enemy Target!
求二分图的最小点覆盖集,并输出 对于每一个a[i][j]=1,我们从行i-->列j建立一条边 显然,这张图是一张二分图.左边的节点代表删除哪一行,右边的节点代表删除哪一列.中间的边代表所有a[i ...
- Html标签中Alt和Title都是提示性语言标签
在Html标签中Alt和Title都是提示性语言标签,在我们浏览一些网页时,鼠标停留在一张图片或文字链接上时,在鼠标的右下角出现一个提示信息框,对目标进行一定的注释说明,这就是它们的作用. 其中 ...