`
aijun980204
  • 浏览: 95988 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Flex 4 SDK 新特性教程系列

    博客分类:
  • flex
阅读更多

本章是Flex 4 SDK 新特性教程系列 的第4章。本章介绍 了MXML 2009新增的标签,包括:

  • Declarations
  • Vector
  • Library
  • Definition
  • Private
  • Reparent

<Declarations />

Declarations标签是Flex 4中最常用的新增标签。
在Flex 3中,对于一个MXML组件的直接子元素,可以有以下几种情况:
1. 属性标签,例如:

<mx:Label
 xmlns:mx="http://www.adobe.com/2006/mxml"
>


    <mx:text
>


        <mx:String
>

test</mx:String
>


    </mx:text
>


</mx:Label
>

2. 作为默认属性的值,例如:
List的默认属性为DataProvider

<mx:List
 xmlns:mx="http://www.adobe.com/2006/mxml"
>


    <mx:ArrayCollection
>


       ....
    </mx:ArrayCollection
>


</mx:List
>

3. 作为容器的Children:

<mx:Canvas
 xmlns:mx="http://www.adobe.com/2006/mxml"
>


    <mx:Button
 />


    <mx:Label
 />


</mx:Canvas
>

4. 声明并创建非可视化对象:

<mx:Canvas
 xmlns:mx="http://www.adobe.com/2006/mxml"
>


   <mx:HTTPService
 id="sevice"
 />


</mx:Canvas
>

在Flex 4中,对于MXML组件的直接子元素有着更加规范的定义,即:所有直接子元素或者是组件的属性标签,或者是作为组件默认属性的值而存在。 而 容器的默认属性即为其Children的集合(例如Group的默认属性为mxmlContent,DataGroup的默认属性为 dataProvider)。

而对于最后一种情况,在Flex 4中,在MXML中创建非可视化对象,如HTTPService, Effect, 基本数据类型等等,必需通过<Declarations/>标签来完成。例如声明一个HTTPService对象:

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


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


    <fx:Declarations
>


        <s:HTTPService
 id="service"
 />


    </fx:Declarations
>


</s:Group
>

上面的代码等价于ActionScript:

public
 MyGroup extends Group {

    private
 var
 service:
HTTPService = new
 HTTPService(
)
;
}

值得注意的是,Declarations标签也可以用来声明、创建任何可视化组件 ,但是使用该标签创建的组件不 会被加入到DisplayList中,也不会被初始化。你可以在需要的时候再使用它。

<Vector />

Vector是Flash Player 10中新增加的数据类型(结构),大多数情况下,使用Vector比使用Array更加高效。在Flex 4中,你可以通过MXML来创建一个Vector对象,例如:

<fx:Declarations
>


    <fx:Vector
 id="myVector"
 type="String"
 fixed="false"
 />


</fx:Declarations
>

上述代码相当于ActionScript:

public
 var
 myVector:
Vector.<
String>
 = new
 Vector.<
String>
(
0
,false
)
;

<Library />和<Definition />

Library标签允许你为当前的MXML组件声明一个”类库“。相应地,Definition标签可以定义该类库中的一个”类”。基本的语法规则 如下:

  • 如果使用Library标签,则它必须是MXML或FXG文档中的第一个标签。
  • Library标签可以包含一个或多个Definition标签。
  • 必须为Definition标签提供name属性作为”类名”,同时Definition标签必须有且只能有一个直接子标签作为其所定义的类的基 类。
  • 使用Definition标签定义的类也可以使用<fx:Script />和<fx:MetaData />标签。
  • 由Definition标签定义的类属于默认包,需使用MXML 2009的命名空间来引用。如类名为MyClass,则在MXML中使用该类的标签为<fx:MyClass/>。
  • Library和Definition标签不可嵌套使用,即在由Definition定义的类中,不能使用Library和Definition 标签。

下面的代码中,使用Library和Definition标签创建了MyClass类及其子类MySubClass:

<!-- MyApp.mxml -->


<s:Applicaiton
 xmlns:fx=... >


  <fx:Library
>


    <!-- 此处定义了一个名为MyClass的类,继承自Group类 -->


    <fx:Definition
 name="MyClass"
>


        <s:Group
>


           <s:Rect
 width="200"
 height="200"
>


               <s:fill
 .../>


           </s:Rect
>


        </s:Group
>


    </fx:Definition
>


    <!-- 此处定义了一个名为MySubClass的类,继承自MyClass类>


    <fx:Definiton
 name="MySubClass"
>


      <fx:MyClass
 />


    </fx:Definition
>


  </fx:Library
>


 
  <!-- 使用MyClass和MySubClass类 -->


  <fx:MyClass
 />


  <fx:MySubClass
 />


</s:Application
>

此外,由Definition定义的类的实例,不能赋予id属性(例如,在上面代码中,如果为MyClass实例声明id属性会造成编译错误)。这 本质上是由Library的“私有性”决定的。在大多数情况下,该标签会在FXG中使用,用于定义可重用的图形元素。

小技巧
事实上,尽管不能为Definition定义的类的实例赋予id属性,我们仍然可以获取这些类的 实例的引用,通过查看Flex编译后的AS代码(使用-keep参数)可以发现:所有由Definition定义的类最终会被转化为类名 为”MXML类名_definitionN.as”这样的独立ActionScript类
例如,上面例子(MXML类名为 MyApp)中的MyClass和MySubClass最终会被转化为MyApp_definition1和MyApp_definition2。在确定 这些类的实际类名后,我们可以通过一些系统事件来获取这些类的引用并对其进行操作,例如:

<!-- Test.mxml -->


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


<s:Application
 xmlns:fx="..."
 xmlns:s="..."
 >


    <fx:Library
>


	<fx:Definition
 name="MyRect"
 >


	    <s:Group
 width="100"
 height="100"
>


		....
	    </s:Group
>


        </fx:Definition
>


    </fx:Library
>


 
    <fx:MyRect
 creationComplete="myrect1_creationComplete(event)"
/>


 
    <fx:Script
>


	<![
CDATA[


	import mx.events.FlexEvent;

	private var myRect:Test_definition1  ;

 
       <!-- 通过事件获取实例的引用 -->

		
        protected function myrect1_creationComplete(event:FlexEvent):void
        {
            myRect = event.target as Test_definition1;
	    myRect.x = 200;
	}
        ]]>
    </fx:Script
>


</s:Application
>

<Private />

Private标签用于提供MXML和FXG文档的元信息,标签内的内容会被编译器忽略。尽管如此,你必须保证其内容是有效的XML格式。例如:

<fx:Private
>

 
    <Author>

Jinni Cao</Author>

 
    <Version>

1.0</Version>


    <Site>

http://www.SWFever.com</Site>


</fx:Private
>

<Reparent />

我们将在下一章“改进的视图状态语法”中详细介绍Reparent标签的使用方法。

本章着重介绍了几个MXML 2009新增加的语言级标签。在下一章中,我们将介绍在Flex 4中被大幅改进的一个特性:视图状态(View State)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics