1.9 Tree 一个使用XML作为Tree组件数据源的小例子
树型组件,是List 变异后的产物。在显示数据时保留了层级结构,每个元素都是一个分支或者叶子,分支包含其他分支或叶子,叶子不可再分。
结构和XML一样,所以用XML 作为Tree的数据源再适合不过了。
tree的事件:
change
在选中列改变时触发。
itemClick
点击某一列时被触发。
itemOpen
、itemClose
在节点展开和关闭时触发。
属性:
labeField
表示显示的文本所对应的XML字段,这里的值为@label
,
@
符号表示后面的名字是XML节点的属性名,是AS3
中的XML数据的专用表达方式。
@label
指得是folder
节点中的label
属性。
change="treeChanged(event) 节点改变事件
在treeChanged
监听函数中,通过Tree
的selectedItem
属性得到当前被选中节点的XML
数据。
Tree(event.target)
强制将 event.target
转换成 Tree
类型。event.target
代表的就是Tree。
as
操作符 是类型转换符,用来将selectedItem
的值转换为XML
类型。如果类型匹配返回该类型的值,否则返回null
。
itemClick="clickItem(event)" 单击节点事件
其实itemClick
事件包括了change 事件,因此treeChanged 并不会被执行。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12"> <mx:Script>
<![CDATA[
import mx.events.TreeEvent;
import mx.events.ListEvent
public var selectedNode:XML;
//
public function treeChanged(event:Event):void {
selectedNode=Tree(event.target).selectedItem as XML;
//res_txt.text = "选择的文件夹:"+selectedNode.@label
}
internal function clickItem(evt:ListEvent):void{
res_txt.text = "点击的节点:"+evt.rowIndex
}
internal function openItem(evt:TreeEvent):void{
res_txt.text = "带开的节点:"+evt.item
}
internal function closeItem(evt:TreeEvent):void{
res_txt.text = "关闭的节点:"+evt.item
}
]]>
</mx:Script>
<mx:XMLList id="files">
<folder label="C:">
<folder label="My Documents">
<folder label="Adobe"/>
</folder>
<folder label="Windows">
<folder label="soft"/>
<folder label="drive"/>
</folder>
<folder label="Image"/>
<folder label="Music"/>
</folder>
</mx:XMLList>
<mx:Tree id="myTree" width="165" height="265" labelField="@label" itemRenderer="nodeItem"
showRoot="true" dataProvider="{files}" itemClick="clickItem(event)" itemOpen="openItem(event)" itemClose="closeItem(event)" change="treeChanged(event)" x="38" y="40"/>
<mx:TextArea id="res_txt" x="211" y="40" height="197"/>
</mx:Application>
Tree 默认采用的itemRenderer是 mx.controls.treeClasses 包中的TreeItemRenderer 类。接着我们来扩展使用它。
data 方法是 itemRenderer 获得数据的核心方法,重写这个方法,并简单修改了节点文字的颜色。
package
{
import mx.controls.treeClasses.*;
import mx.collections.*;
public class nodeItem extends TreeItemRenderer
{
//
public function nodeItem() {
super();
}
//这是接收外部数据的核心方法
override public function set data(value:Object):void {
super.data = value;
//判断是否还有子节点,采用不同的颜色和字样
if(TreeListData(super.listData).hasChildren)
{
setStyle("color", 0x006699);
setStyle("fontWeight", 'bold');
}
else
{
setStyle("color", 0x000000);
setStyle("fontWeight", 'normal');
}
}
}
}
1.10 TileList 和 HorizontalList
TileList 和 容器Tile 没有联系,不过两者实现的效果基本相似,都是采用块的形式布局。TileList = Tile + List
columnCount 属性用来设定每行显示的元素个数,组件根据每行的个数自动计算出元素的位置。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Style source ="style.css"/>
<mx:Model id="images">
<image>
<item label="图片1" data="images/Baby01.gif"/>
<item label="图片2" data="images/Baby02.gif"/>
<item label="图片3" data="images/Baby03.gif"/>
<item label="图片4" data="images/Baby04.gif"/>
<item label="图片5" data="images/Baby01.gif"/>
<item label="图片6" data="images/Baby02.gif"/>
<item label="图片7" data="images/Baby03.gif"/>
<item label="图片8" data="images/Baby04.gif"/>
</image>
</mx:Model>
<mx:TileList itemRenderer="ImageItem" x="29" y="49" height="196" columnCount="3" dataProvider="{images.item}">
</mx:TileList>
</mx:Application>
创建itemRenderer 来定义每个元素的界面。
data.data对应数据源中item.data
data.label对应数据源中item.label
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="98" height="64" horizontalAlign="center">
<mx:Image width="32" height="32" source="{data.data}"/>
<mx:Button x="38" y="40" label="{data.label}"/>
</mx:VBox>
1.11 文本处理
文本处理组件:
Text: 可以使用HTML不过要借助htmlText 标签或 htmlText 属性。插入HTML代码时需要使用CDATA标签。
TextArea: editable属性为true时,相当于一个支持多行的TextInput。支持HTML和内置滚动条。
TextInput 和 RichTextEditor 以及 Label
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Style>
Application{
fontSize:12;
backgroundGradientColors: #c0c0c0, #c0c0c0;
}
</mx:Style>
<mx:Text x="51" y="56" width="253" height="23" text="简单文本"/>
<mx:TextArea x="51" y="96" text="文本区" editable="false" width="172" height="48"/>
<mx:TextInput x="51" y="171" text="输入框" displayAsPassword="true"/>
<mx:Text width="253" height="96" x="51" y="226">
<mx:htmlText>
<![CDATA[<font color="#0000FF">HTML文本</font> <u>支持html标签</u><img src="images/Baby01.gif"/>... ]]>
</mx:htmlText>
</mx:Text>
</mx:Application>
1.12 一个强有力的组件 -- RichTextEditor
它实现了HTML所有功能。
是一个集成了文本处理功能的Panel组件,主要包括:TextArea 文本区 和 控制文字格式的容器。
在容器中包括了其他的组件,如 字体选择的ComboBox 、选择文本颜色的 ColorPicker 、选择文本对齐方式的ToggleButtonBar 等等。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="442" height="420">
<mx:RichTextEditor x="10" y="10" width="403" height="281" id="myRich">
</mx:RichTextEditor>
<mx:TextArea id="output_txt" x="10" y="309" width="330" height="101"/>
<mx:Button x="348" y="308" label="查看文本" click="output_txt.text= myRich.text"/>
<mx:Button x="348" y="388" label="HTML代码" width="70" click="output_txt.text= myRich.htmlText"/>
</mx:Application>
1.13 设备字体和嵌入字体的应用实例
设备字体:用户机器上所有字体都最大可能地模拟其外观,保持文本的样式不会出现较大变化。支持三种设备字体:_sans, _serif, _typewriter。
设备字体必须使用引号""包含。
嵌入字体:将字体文件编译进SWF文件中或者运行时加载到SWF文件中,供SWF文件使用。并使文本具有抗锯齿特性,边缘更平滑,同时文本可以设置透明度,还可以旋转。缺点就是增加程序的文件大小,字体小于10时就很难辨认。
<mx:Style>
@font-face {
src:local("Arial"); //嵌入字体local,表示本机系统中的字体
src:url("./Arial.swf"); //指定的字体文件地址,将字体房子SWF文件中,然后加载它。
fontFamily: myFont; //字体的别名,必须定义
fontStyle: normal; //可选项,默认normal 正常,italic 斜体 oblique 倾斜
fontWeight: normal; //可选项,默认normal 正常,bold 粗体 heavy 加倍粗体
flashType: true; //可选项,默认true,添加文本的额外信息,使得文本抗锯齿,平滑显示
//限制嵌入的字符。字符编码必须采用Unicode标准。
unicodeRange:
U+0041-U+005A, //大写字母A-Z
U+0061-U+007A, //小写字母a-z
U+0030-U+0039, //数字0-9
U+002E-U+002E, //点.
}
</mx:Style>
定义字符的方法也可以在Flex SDK 2\frameworks\flex-config.xml中添加相关信息。
在@font-face中就可以这样使用:unicodeRange:"englishRange"
<fonts>
<languages>
<language-range>
<lang>englishRange</lang>
<range>U+0020-U+007E</range>
</language-range>
</languages>
</fonts>
flash-unicode-table.xml列出了绝大部分语言的Unicode的字符范围。可以参考并将copy到flex-config.xml中。