1. <fx:Definition> 标签(由编译器实现的)
可以在一个 <fx:Library> 标签内使用一个或多个 <fx:Definition> 标签定义图形子对象,然后可以将子对象用于应用程序的其它部分中。
<fx:Library> 标签可以有任何数量的 <fx:Definition> 标签作为子对象。
在作为 <fx:Library> 标签外部的标签添加 <fx:Definition> 标签之前,后一个标签中的元素不会被实例化或添加到显示列表。
<fx:Component> 标签的语法如下:
<fx:Library>
<fx:Definition name=defName>
<!-- Graphical children. -->
</fx:Definition>
...
<fx:Definition name=defName>
<!-- Graphical children. -->
</fx:Definition>
</fx:Library>
<fx:Definition> 标签必须定义 name 属性。在实例化该元素时,将使用该属性作为标签名。
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:s="library://ns.adobe.com/flex/spark"> <fx:Library> <fx:Definition name="MySquare"> <s:Group> <s:Rect width="100%" height="100%"> <s:stroke> <s:SolidColorStroke color="red"/> </s:stroke> </s:Rect> </s:Group> </fx:Definition> <fx:Definition name="MyCircle"> <s:Group> <s:Ellipse width="100%" height="100%"> <s:stroke> <s:SolidColorStroke color="blue"/> </s:stroke> </s:Ellipse> </s:Group> </fx:Definition> </fx:Library> <mx:Canvas> <fx:MySquare x="0" y="0" height="20" width="20"/> <fx:MySquare x="25" y="0" height="20" width="20"/> <fx:MyCircle x="50" y="0" height="20" width="20"/> <fx:MyCircle x="0" y="25" height="20" width="20"/> <fx:MySquare x="25" y="25" height="20" width="20"/> <fx:MySquare x="50" y="25" height="20" width="20"/> <fx:MyCircle x="0" y="50" height="20" width="20"/> <fx:MyCircle x="25" y="50" height="20" width="20"/> <fx:MySquare x="50" y="50" height="20" width="20"/> </mx:Canvas> </s:Application> <fx:Library>
2.RichText
RichText 是可以显示一行或多行富文本或嵌入图像的低级 UIComponent。
由于性能原因,它不支持滚动、选择、编辑、可单击的超链接或从 URL 加载的图像。如果需要这些功能,请参阅 RichEditableText 类。
RichText 使用 Text Layout Framework (TLF) 库,而该库又基于 Flash Player 10 中的 Flash 文本引擎 (FTE)。组合后,
它们可以提供使用高质量国际印刷效果的富文本布局。
Spark 体系结构提供三个文本“原型”- Label、RichText 和 RichEditableText。
Label 运行速度最快且占用内存最少,因为它仅使用 FTE,没有 TLF,但其功能有限:无富文本、不可滚动、不可选择、不可编辑。
RichText 新增了使用复杂布局显示富文本的功能,但仍然完全是非交互式的。
RichEditableText 占用内存最多,但是提供 TLF 可以执行的大部分功能。您应该使用能够满足需求且占用最小内存的文本原型。
RichText 与 MX 控件 mx.controls.Text 相似。Text 控件使用旧版 TextField 类(而不是 TLF)来显示文本。
RichText 和 Text 之间最重要的区别是:
与 Text 相比,RichText 可提供更佳的印刷效果和文本布局,且能更好地支持各国语言。
RichText 拥有所显示内容的面向对象模型版本,而 Text 没有。
Text 是可选择的,但 RichText 不支持选择操作。
RichText 使用 TLF 面向对象模型的富文本,其中,诸如分段、段落、跨距和图像等文本布局元素在运行时由 ActionScript 对象表示,
可以通过编程方式访问和操纵该对象。TLF 中用于表示富文本的中心对象是 TextFlow,
因此可以通过将 RichText 的 textFlow 属性设置为 TextFlow 实例,来指定应显示的相应 RichText。
(有关如何创建 TextFlow 的信息,请参阅 textFlow 属性的描述。)
还可以设置从 TextBase 继承的 text 属性,但是如果不需要 TextFlow 的各种格式,应考虑改用 Label。
RichText中html标签:
<s:div> DivElement
<s:p> ParagraphElement
<s:span> SpanElement
<s:a> LinkElement
<s:img> InlineGraphicElement
<s:br> BreakElement
<s:tab> TabElement
<s:tcy> TCYElement
3.Group
Group 类是可视元素的容器基类。Group 容器将实现 IUIComponent 接口的任何组件和实现 IGraphicElement 接口的任何组件视为子代。希望管理可视子项(可视组件和图形组件)时,使用此容器。
为了改进性能和最小化应用程序大小,不能设置 Group 容器的外观。如果希望应用外观,请改用 SkinnableContainer。
注意:当 Group 内部存在 DisplayObject 子代(如组件或另一个 Group)时,刻度网格可能无法正常工作。如果子代是 GraphicElement 对象,并且全部共享该 Group 的 DisplayObject,则刻度网格将正常工作。
对 GraphicElement 子代设置下列任何属性要求 GraphicElement 创建其自己的 DisplayObject,从而使 Group 的刻度网格属性无效。
<?xml version="1.0"?> <!-- Simple example to demonstrate the Spark Group component. --> <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:Panel title="Group Component Example" width="75%" height="75%" horizontalCenter="0" verticalCenter="0"> <s:VGroup left="10" right="10" top="10" bottom="10"> <s:Group> <!-- use a vertical layout with a 1 pixel gap between items --> <s:layout> <s:VerticalLayout gap="1" /> </s:layout> <s:Label text="Group with a vertical layout" /> <s:Rect width="150" height="20"> <s:fill> <s:SolidColor color="0xE3E3E3" /> </s:fill> </s:Rect> <s:Rect width="150" height="20"> <s:fill> <s:SolidColor color="0xCCCCCC" /> </s:fill> </s:Rect> <s:Rect width="150" height="20"> <s:fill> <s:SolidColor color="0x888888" /> </s:fill> </s:Rect> </s:Group> <mx:Spacer height="20" /> <s:Group> <!-- use a horizontal layout with a 1 pixel gap between items --> <s:layout> <s:HorizontalLayout gap="1" /> </s:layout> <s:Label text="Group with a horizontal layout" /> <s:Rect width="25" height="25"> <s:fill> <s:SolidColor color="0xE3E3E3" /> </s:fill> </s:Rect> <s:Rect width="25" height="25"> <s:fill> <s:SolidColor color="0xCCCCCC" /> </s:fill> </s:Rect> <s:Rect width="25" height="25"> <s:fill> <s:SolidColor color="0x888888" /> </s:fill> </s:Rect> </s:Group> <mx:Spacer height="20" /> <s:Group width="150" height="100"> <!-- use the default basic layout where items are absolutely positioned --> <!-- add a background rectangle to stretch to fit the group --> <s:Rect top="0" left="0" right="0" bottom="0"> <s:fill> <s:SolidColor color="0xCCCCCC" /> </s:fill> </s:Rect> <s:Label x="0" y="0" text="Group with a basic layout" /> <s:Rect x="20" y="20" width="30" height="25"> <s:fill> <s:SolidColor color="0xE3E3E3" /> </s:fill> </s:Rect> <s:Rect x="40" y="40" width="30" height="30"> <s:fill> <s:SolidColor color="0x888888" /> </s:fill> </s:Rect> <s:Rect x="60" y="60" width="30" height="30"> <s:fill> <s:SolidColor color="0xBBBBBB" /> </s:fill> </s:Rect> </s:Group> </s:VGroup> </s:Panel> </s:Application>
4.BorderContainer(可以有背景的group)
BorderContainer 类定义一组 CSS 样式,用于控制容器的边框外观和背景填充。
注意:因为使用 CSS 样式和类属性控制 BorderContainer 的外观,所以通常不会为该容器创建自定义外观。如果确实创建了自定义外观,外观类应当应用任何样式控制容器外观。
默认情况下,边框的笔触是圆形的。如果不喜欢圆角,请将笔触的 joints 属性设置为 JointStyle.MITER。
BorderContainer 容器具有下列默认特征:
特征 说明
默认大小 112 个像素宽 × 112 个像素高
最小大小 112 个像素宽 × 112 个像素高
最大大小 10000 个像素宽 × 10000 个像素高
默认外观类 spark.skins.spark.BorderContainerSkin
<s:BorderContainer width="378" borderColor="#000000" borderWeight="4"> <s:backgroundFill> <s:RadialGradient> <s:entries> <s:GradientEntry color="#FFFFFF"/> <s:GradientEntry color="#999999"/> </s:entries> </s:RadialGradient> </s:backgroundFill> <s:Label text="A BorderContainer with a backgroundFill object" fontSize="14" fontWeight="bold" horizontalCenter="0" verticalCenter="0"/> </s:BorderContainer>
--flex 4改变容器的层次关系:
1.使用setElementIndex改变
<fx:Script> <![CDATA[ import mx.core.IVisualElement; protected function handler(event:Event):void { this.setElementIndex(event.currentTarget as IVisualElement,this.numElements-1); //this.swapElements(demo1,demo2);等上面代码 } ]]> </fx:Script> <s:Panel id="demo1" title="demo1" width="244" height="215" color="red" click="handler(event)"> </s:Panel> <s:Panel id="demo2" title="demo2" width="244" height="215" x="134" y="45" color="green" click="handler(event)" />
2.改变元素的 depth 方法(必须是一组组件)
<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 mx.core.IVisualElement; import spark.components.supportClasses.GroupBase; private var currentIndex:int = 0; private function swapDepths():void { var layoutTarget:GroupBase = bLayout.target; var element:IVisualElement; for( var i:int = 0; i < layoutTarget.numElements; i++ ) { element = layoutTarget.getElementAt( i ) as IVisualElement; if( i == currentIndex ) { element.depth = layoutTarget.numElements - 1; } else if( i > currentIndex ) { element.depth = i - 1; } } if( ++currentIndex > layoutTarget.numElements - 1 ) currentIndex = 0; } ]]> </fx:Script> <s:layout> <s:VerticalLayout /> </s:layout> <s:Group> <s:layout> <s:BasicLayout id="bLayout" /> </s:layout> <s:Button x="0" label="(1) button" /> <s:Button x="30" label="(2) button" /> <s:Button x="90" label="(3) button" /> </s:Group> <s:Button label="swapDepths" click="swapDepths();" /> </s:Application>
--Matrix3D 使用
<fx:Script> <![CDATA[ import mx.core.UIComponent; [Bindable] private var rot:Number = 90; private function rotate():void { var matrix:Matrix3D = button.getLayoutMatrix3D(); matrix.appendRotation( 90, Vector3D.Z_AXIS ); button.layoutMatrix3D = matrix; rot += 90; } ]]> </fx:Script> <s:Group> <s:Group width="120"> <s:layout> <s:VerticalLayout paddingLeft="5" paddingRight="5" paddingTop="5" paddingBottom="5" /> </s:layout> <s:Button id="button" label="push over" click="rotate();" /> </s:Group> </s:Group>
--Rotate3D 使用
<fx:Declarations> <s:Rotate3D id="rotator1" autoCenterTransform="true" target="{btn1}" angleXFrom="0" angleXTo="360" /> <s:Rotate3D id="rotator2" autoCenterTransform="true" target="{btn2}" angleYFrom="360" angleYTo="0" /> </fx:Declarations> <s:Group width="300" height="300"> <s:Group width="100%" height="100%"> <s:layout> <s:VerticalLayout paddingLeft="5" paddingRight="5" paddingTop="5" paddingBottom="5" horizontalAlign="center" /> </s:layout> <s:Button id="btn1" label="(0) button" click="{rotator1.play();}" /> <s:Button id="btn2" label="(1) button" click="{rotator2.play();}" /> </s:Group> <s:Rect width="100%" height="100%"> <s:stroke> <mx:SolidColorStroke color="#000000" /> </s:stroke> </s:Rect> </s:Group>
<fx:Script> <![CDATA[ import flash.text.engine.TextLine; import flashx.textLayout.compose.IFlowComposer; import flashx.textLayout.compose.TextFlowLine; import flashx.textLayout.edit.SelectionState; import flashx.textLayout.events.SelectionEvent; [Bindable] private var bitmapData:BitmapData; private function selectionChanged(event:SelectionEvent):void { if(event.selectionState) { var state:SelectionState = event.selectionState; var composer:IFlowComposer = textAreaInst.textFlow.flowComposer; var tfline:TextFlowLine = composer.findLineAtPosition(state.anchorPosition); var tline:TextLine = tfline.getTextLine(); if(tline) { var rect:Rectangle = tline.getAtomBounds(state.absoluteStart - tfline.absoluteStart); bitmapData = new BitmapData(tline.textBlock.baselineFontSize+ 33, tline.textBlock.baselineFontSize + 33, false, 0xf6f6f6); var scaleMatrix:Matrix = new Matrix(0.9, 0, 0, 1,1 * rect.x *-1,rect.y *-1); bitmapData.draw(tline, scaleMatrix); img.source = bitmapData; } } } ]]> </fx:Script> <s:BitmapImage id="img" width="200" height="200" source="{bitmapData}"/> <s:TextArea id="textAreaInst" fontSize="16"> <s:textFlow> <s:TextFlow selectionChange="selectionChanged(event)"> <s:p> <s:span> The TextFlow class is responsible for managing all the text content of a story. </s:span> <s:span> In TextLayout, text is stored in a hierarchical tree of elements. </s:span> </s:p> </s:TextFlow> </s:textFlow> </s:TextArea>
--flex4 State 使用
<s:states> <s:State name="normal" /> <s:State name="author" /> </s:states> <mx:Image id="imageHolder" width="140" height="140" horizontalAlign="center" verticalAlign="middle" source="@Embed(source='1.png')" source.normal="@Embed(source='1.png')" source.author="@Embed(source='111.png')"/> <s:Button id="selectorBtn" width="140" label="Show Mike" label.author="Show FlashGen" click="currentState='author'" click.author="currentState=''"/> <s:states> <s:State name="normal" /> <s:State name="state1" /> <s:State name="state2" /> <s:State name="state3" /> <s:State name="state4" /> <s:State name="state5" /> </s:states> <s:Button id="btn1" label="Button 1" includeIn="normal, state1, state2, state4"/> <s:Button id="btn2" label="Button 12121" excludeFrom="normal, state3"/> <s:Button id="btn3" label="Button 3" includeIn="normal, state3, state5"/> <s:ComboBox id="cBox" dataProvider="{new ArrayCollection([{label:'normal'}, {label:'state1'}, {label:'state2'}, {label:'state3'}, {label:'state4'},{label:'state5'}])}" selectedIndex="0" change="currentState = cBox.selectedItem.label"/>