`

as3 元数据标签的意义解析(Flex 2 Metadata Tags)

阅读更多
英文原文:Flex 2 Metadata Tags
原文地址:http://mxdj.sys-con.com/read/361239.htm

原文作者:Rich Tretola(作者是everythingflex.com的创建人以及IFBIN的贡献者之一)
文章来自: 闪无忧(www.5uflash.com) 详文参考:http://5uflash.com/Flex-AIR/Flexziliao/1479.html
感谢译者:Dreamer,http://www.zhuoqun.net/

Flex 2 中的元数据标签
http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
——告诉编译器如何编译

虽然多数Flex开发者都使用过[Bindable]标签,但是很多人都不知道这个标签的作用甚至不知道该标签为何物。[Bindable]就是所谓的元数据标签。元数据标签是一种特殊的标签,它在代码中的作用就是向编译器提供如何编译程序的信息。实际上,这些标签并没有被编译到生成的SWF文件中,而只是告诉编译器如何生成SWF文件。文档中列出的元数据标签共有12个,本文将讲解这些元数据标签的定义并给出使用它们的示例,在看完这篇文章之后,你就会明白应该在何时何处在你的Flex 2应用程序中使用元数据标签了。

[ArrayElementType]

实际上,定义一个数组通常来说是一件很平常的事情,因为数组中的元素可以是任何类型的。不过,使用ArrayElementType元数据标签可以让你定义数组元素的数据类型。下面的例子展示了如何使用[ArrayElementType]:
程序代码
   [ArrayElementType("String")]
    public var arrayOfStrings:Array;

    [ArrayElementType("Number")]
    public var arrayOfNumbers:Array;

    [ArrayElementType("mx.core.UIComponent")]
    public var arrayOfUIComponents:Array; 


[Bindable]

Bindable元数据标签是最经常用到的一个元数据标签,因为它使程序组件之间的数据同步变得很容易。Bindable可以用来绑定简单数据类型、类、复杂数据类型以及函数。绑定数据的时候,你必须先使用元数据标签定义一下数据,正如Listing 1中所示的那样。图1是Listing 1的代码运行结果。

Bindable也可以用来绑定到事件。Listing 2展示了如何使用getter和setter函数将一个属性绑定到一个事件上。这个例子中有一个叫做phoneNumber的私有变量,还有一个公有的setter和getter函数。使用Bindable标签将这个getter方法绑定到了一个叫做phoneNumberChanged的事件上,只要数据发生改变setter方法就会分派phoneNumberChanged事件。通过使用setter方法,可以在数据赋予私有变量之前对其进行操作。在这个例子中,数据只有在长度大于等于10的时候才会被格式化。当phoneNumberChanged事件被分派的时候,第二个TextInput组件会被更新,因为他的text属性绑定到了phoneNumber变量上。

图2和图3显示了Listing 2代码的运行结果。
图2

图3


[DefaultProperty]

DefaultProperty元数据标签用来将一个单一属性设定为某个类的默认属性。它允许在一个容器标签内设定属性,而不用定义属性的名字。一个简单的例子就是一个自定义Button类。Listing 3展示了一个简单的Button类,它将label属性设定为了DefaultProperty。
Listing 4展示了label属性是如何在自定义Button标签中作为一个字符串定义的。

[Embed]

Embed元数据标签用来导入图片到程序。可以通过两种方式使用Embed。你可以将图片嵌入到ActionScript中并将其指派给一个变量(如同下面代码中的第一个例子),或者你也可以将图片直接指派给组件的属性(使用下面代码中的第二个例子所示的语法规则)。

例1:
程序代码
[Embed(source="myIcon.gif")]
[Bindable]
public var myIcon:Class;

<mx:Button label="Icon Button 1" icon="{myIcon}"/>

<mx:Button label="Icon Button 2" icon="{myIcon}"/> 


例2:
<mx:Button label="Icon Button 1" icon="@Embed(source=myIcon.gif')"/>

<mx:Button label="Icon Button 2" icon="@Embed(source=myIcon.gif')"/> 


上面这两个例子产生的结果是一样的。创建myIcon类的好处是,它在一个类中只定义一次并可以绑定到程序中的多个组件。

[Event]

Event元数据标签用来声明那些被自定义类分派的事件。将这个元数据标签添加到类定义中之后,你就可以在MXML标签中添加事件处理函数来初始化该自定义类。Listing 5创建了一个自定义Button类,每当它的label属性改变的时候就会分派一个事件。Listing 6所显示的主程序文件初始化了这个自定义Button并创建了事件处理函数,该函数将新的labe属性值赋给了一个TextArea组件以显示当前发生的更改。

图4显示了Listing 5 和 Listing 6中的代码运行结果。
图4


[Effect]

Effect元数据标签用来定义一个自定义效果,当某个事件发生的时候该效果会被分派。这个示例可以基于前面Event的例子来创建,通过简单地更改ButtonLabel类(Listing 7)中的一行代码,就定义了一个效果,该效果可以在MXML标签中直接使用(Listing

[IconFile]

IconFile是用来定义一个jpg,gif或者png文件的文件名的,它在你的自定义类中作为图标来使用。[Embed]元数据标签可以用来嵌入图片、SWF文件、音乐文件以及视频文件等,而IconFile则只是用来嵌入用来作为自定义类图标的文件。下面是一个IconFile的例子:



程序代码
[IconFile("icon.png")]
public class CustomButton extends Button
{

}



[Inspectable]

在使用Flex Builder 2的时候,你可能会希望某些自定义组件的属性在代码提示和属性检查器(property inspector)中显示,Inspectable元数据标签就是用来定义那些属性的。Listing 9展示的例子定义了一个inspectable的ccType变量,它定义了Visa为默认值、Credit Card为类别并将取值范围定义为包含了Visa, Mastercard, Discover, 和 American Express的枚举。

图5展示了当将组件添加到程序中的时候所显示的代码提示。

图5:


图6与上面展示的是同样的代码,但是这次是设计视图,所以我们能看到属性检查器。你可以看到属性ccType的类别为Credit Card,它的所有可选的值都在下拉列表中。

图6:


[InstanceType]

当在一个模板对象中声明一个像IDeferredInstance这样的变量时,InstanceType元数据标签就用来声明对象的类型。下面是InstanceType的用法:

程序代码
[InstanceType("package.className")] 



[NonCommittingChangeEvent]

NonCommittingChangeEvent元数据标签在某个特定事件发生的时候可以防止变量在事件发生的过程中被更改。Listing 10展示了它是如何工作的。一个名为s的字符串类型的私有变量被绑定到了名为ti2的TextInput组件上。另外一个id为ti1的TextInput组件在它的text发生更改的时候就会将s的值设置为它的text属性的值。另外,当triggerBinding 事件被分派的时候,附加在s变量上的Binding元数据标签就会进行绑定。只有在Enter键在ti1 TextInput组件中被按下时才会分派triggerBinding事件。

[RemoteClass]

RemoteClass可以用来将一个ActionScript类绑定到一个Java类或一个ColdFusion CFC。这样做可以自动转换数据类型。下面的例子将包com.mydomain中的名为MyClass的ActionScript类绑定到了同一个包中名为MyClass的Java类:

程序代码

package com.mydomain {
   [Bindable]
   [RemoteClass(alias="com.mydomain.MyClass")]
   public class MyClass {
     public var id:int;

     public var myText:String;

   }
} 


[Style]

Style元数据标签用来为组件定义自定义样式属性的。只需要简单地将Sytle元数据标签添加到类的定义当然,然后就可以使用getSytle方法获取它的值了。Listing 11 和 12中的例子定义了两个样式,分别为borderColor 和fillColor,它们的数据类型都是uint。当类初始化的时候这两个样式就会在标签中被设定。代码中覆写了updateDisplayList函数,用自定义的样式画了一个圆形边框并将其填充。

图7展示了Listing 11 和 Listing 12中代码运行的结果。

图7:


现在你应该会有这样的感觉了:“喔,现在我知道在哪里可以使用它们了”或者“嗯,我想我会在新的项目中尝试使用这些元数据标签”。如果你没有,那么你可能需要回过头去再看一遍这篇文章。OK,我想说的是Adobe Flex小组提供给我们的元数据标签不只是非常的强大,可以让我们扩展或自定义我们要做的东西,而且它还非常易于使用。通过使用它们,仅仅几行代码就可以完成一大堆事情。如果不使用这些标签,你会发现在Flex 2中实现一些东西是很辛苦的。

代码集合(Listing 1-12):
//Listing 1 A simple use of [Bindable]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
[Bindable]
private var me:String="Rich Tretola";
]]>
</mx:Script>
<mx:Panel title="Simple Binding" width="500" height="90"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<mx:Label text="{me}"/>
</mx:Panel>
</mx:Application>

//Listing 2 Using [Bindable] with getters and setters

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
private var _phoneNumber:String = ?;
// Bind getter function to phoneNumberChanged event
[Bindable(event="phoneNumberChanged")]
public function get phoneNumber():String {
return _phoneNumber;
}
// Setter method.
public function set phoneNumber(value:String):void {
if (value.length<10) {
_phoneNumber = value;
} else {
_phoneNumber = phoneFormatter.format(value);
}
// Create and dispatch event
var eventObj:Event = new Event(損honeNumberChanged");
dispatchEvent(eventObj);
}
]]>
</mx:Script>
<mx:PhoneFormatter id="phoneFormatter"
formatString="(###) ###-####" validPatternChars="#-()
?>
<mx:Panel title="Bind with Getters and Setters"
width="500" height="90"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<mx:TextInput id="ti1" change="phoneNumber=ti1.text"
maxChars="10" restrict="0-9"/>
<mx:TextInput id="ti2" text="{phoneNumber}"/>
</mx:Panel>
</mx:Application>

//Listing 3 Custom Button class named MyButton

package
{
import mx.controls.Button;
[DefaultProperty(搇abel")]
public class MyButton extends Button
{
}
}

//Listing 4 Using the MyButton class wih [DefaultProperty]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comps="*">
<comps:MyButton>
<mx:String>Test</mx:String>
</comps:MyButton>
</mx:Application>

//Listing 5 Custom ButtonLabel class using [Event]

package
{
import mx.controls.Button;
import flash.events.Event;
// Define the custom event
[Event(name="labelChanged", type="flash.events.Event")]
public class ButtonLabel extends Button {
// property to hold label value
private var _myLabel:String;
// public setter method
public function set myLabel(s:String):void {
_myLabel = s;
this.label = s;
// Create and dispatch custom event
var eventObj:Event = new Event(搇abelChanged");
dispatchEvent(eventObj);
}
}
}

//Listing 6 Using the ButtonLabel class with the labelChanged [Event]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comps="*"
backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.events.Event;
// method to handle custom event
public function labelChanged(eventObj:Event):void {
myTA.text= myTA.text + 揬n"+ eventObj.target.label;
myTA.verticalScrollPosition = myTA.verticalScrollPosition +
20;
}
]]>
</mx:Script>
<mx:Panel title="Event Sample" width="500" height="275"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="absolute">
<mx:TextInput id="buttonLabelTI"
change="myButton.myLabel=buttonLabelTI.text" x="10" y="9"/>
<!--Instantiate custom class and define method to handle label-
Changed event-->
<comps:ButtonLabel id="myButton" labelChanged="labelChanged(event)
;"
x="10" y="39"/>
<mx:TextArea id="myTA" width="200" height="200" x="249" y="10"/>
</mx:Panel>
</mx:Application>

//Listing 7 Add the Effect metadata tag

...
// Define the custom event
[Event(name="labelChanged", type="flash.events.Event")]
[Effect(name="labelChangedEffect", event="labelChanged")]
public class ButtonLabel extends Button {
...

//Listing 8 Add labelChangedEffect to the Component

Instantiation MXML Tag
<comps:ButtonLabel id="myButton" labelChanged="labelChanged(event);"
labelChangedEffect="myEffect" x="10" y="39"/>

//Listing 9 Custom component with [Inspectable] defined

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Inspectable(defaultValue="Visa",
enumeration="Visa,Mastercard,Discover,American Express"
category="Credit Card" type="String")]
public var ccType:String;
]]>
</mx:Script>
</mx:HBox>

//Listing 10 Using [NonCommittingChangeEvent]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
import flash.events.Event;
private var eventObj:Event;
[Bindable(event="triggerBinding")]
[NonCommittingChangeEvent(揷hange")]
private var s:String;
private function triggerBinding():void{
eventObj = new Event(搕riggerBinding");
dispatchEvent(eventObj);
}
]]>
</mx:Script>
<mx:Panel title="NonCommittingChangeEvent Sample" width="500"
height="90"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<mx:TextInput id="ti1" change="s=ti1.text" enter="triggerBinding()"
/>
<mx:TextInput id="ti2" text="{s}" />
</mx:Panel>
</mx:Application>

//Listing 11 Custom Class CustomCircle using [Style] tags

package
{
import mx.core.UIComponent;
[Style(name="borderColor",type="uint",format="Color",inherit="no")]
[Style(name="fillColor",type="uint",format="Color",inherit="no")]
public class CustomCircle extends UIComponent {
public function CustomCircle(){
super();
}
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
graphics.lineStyle(1, getStyle(揵orderColor"), 1.0);
graphics.beginFill(getStyle(揻illColor"),1.0);
graphics.drawEllipse(0,0,100,100);
}
}
}

//Listing 12 Using CustomCircle and assigning custom style properties

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comps="*"
backgroundColor="#FFFFFF">
<mx:Panel title="Style Sample" width="200" height="200"
paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom=" 10" layout="horizontal">
<comps:CustomCircle borderColor="#000000" fillColor="#FF0000" />
</mx:Panel>
</mx:Application>








  • 大小: 18.7 KB
  • 大小: 18.7 KB
  • 大小: 19.2 KB
  • 大小: 30.1 KB
  • 大小: 34.3 KB
  • 大小: 36.6 KB
  • 大小: 18 KB
分享到:
评论

相关推荐

    flex as3 元数据标签综合

    在Flex与AS3(ActionScript 3)开发中,元数据标签(Metadata Tags)是一种重要的语法结构,用于向编译器提供有关类或成员的额外信息。这些标签能够帮助编译器优化代码、提供更强大的功能,并允许开发者实现自定义...

    java读取metadata元信息

    在Java编程中,元数据(Metadata)是指关于数据的数据,它提供有关文件、数据库记录、类、方法等的附加信息,但不直接构成这些实体的实际内容。元数据可以帮助理解和处理这些对象,例如,图片的元数据可能包含拍摄...

    管理系统系列--元数据管理系统(leap metadata)是用于企业内进行元数据管理的Web应用程序。该系统提供直.zip

    元数据管理系统,通常被称为MDM(Metadata Management System),在企业信息化建设中扮演着至关重要的角色。元数据,简单来说,就是关于数据的数据,它描述了数据的来源、含义、格式、关系等信息,有助于企业更好地...

    都柏林核心元数据集-dublin core metadata

    defiens fifteen matadata elements for resource description in a cross-dsciplinary information environment.

    元数据核心架构解析

    ### 元数据核心架构解析 #### 一、基于模型体系的元数据架构 在现代信息技术领域,元数据作为描述数据的数据,在数据管理、数据分析及数据治理等方面发挥着至关重要的作用。一个良好的元数据架构能够有效地整合...

    metadata公共元数据项目源码

    《metadata公共元数据项目源码解析》 在IT领域,数据是驱动业务发展的核心要素,而元数据(Metadata)则是理解和管理数据的关键。本篇文章将深入探讨“metadata公共元数据项目”的源码,帮助读者理解元数据的重要性...

    元数据参考资料(metadata)

    本文将深入探讨元数据的概念、格式、工具以及其在数字化图书馆中的应用体系,旨在全面解析这一关键概念。 ### 元数据的本质与定义 元数据的核心概念是“data about data”(关于数据的数据),这一定义虽简洁却...

    dotnet-MetadataExtractor从图片和电影文件提取ExifIPTCXMPICC等其它元数据

    例如,`MetadataExtractor.IO.ImageMetadataReader` 类可以用来读取图像文件,而`Directory.GetTags()` 方法可以获取特定元数据目录下的所有标签。 对于更复杂的场景,如处理多层嵌套的元数据或者自定义解析规则,...

    arcgis 元数据操作

    ArcGIS 元数据操作是指在 ArcGIS 平台中对元数据的操作,包括解析 ArcGIS 元数据结构、将元数据转换为 XML 格式等。元数据是指描述数据的数据,例如数据的名称、作者、创建时间等信息。在 ArcGIS 中,元数据起着...

    flex数据绑定的原理

    当我们使用`[Bindable]`元数据标签标记一个类的成员变量时,Flex编译器会自动为这个变量生成相关的访问器(getter和setter)。例如,在提供的代码段中,`list`变量被标记为`[Bindable]`: ```actionscript public ...

    metadata-extractor-2.x资源jar包

    metadata-extractor-2.x是一个强大的开源库,专为了解析这些元数据而设计。本文将详细介绍metadata-extractor库及其核心组件XMPcore,以及如何在实际项目中应用它们。 metadata-extractor是由David Cochrane开发的...

    Metadata2Shp.rar 根据卫星元数据(xml格式的)生成shp

    1. **解析XML元数据**:首先,Metadata2Shp工具会读取XML文件,解析出相关的地理信息,如经纬度范围、投影系统、像素大小等。 2. **坐标系统转换**:如果元数据中的坐标系统与Shapefile所需的坐标系统不同(通常是...

    元数据的概念详细解析.pdf

    元数据的管理通常涉及元数据库,这些数据库采用特定的元数据模型,如CSDGM(Content Standard for Digital Geospatial Metadata),该模型提供了一套详细的元数据结构,用于描述地理空间数据集的各个方面。元数据...

    改进的metadata2shp 或者叫xml2shp

    "改进的metadata2shp 或者叫xml2shp"是一个专注于将卫星元数据转化为ESRI Shapefile(简称shp)格式的程序。元数据通常包含有关地理空间数据的详细信息,如坐标系统、时间戳、分辨率等,而shp是一种广泛使用的矢量...

    mediautil+metadata-extractor

    这个工具包含两个核心组件:`meduautil-1.0.jar`和`metadata-extractor-2.3.1.jar`,它们都是Java编写的库文件,可以方便地集成到各种Java应用程序中来读取和解析多媒体文件的元数据。 首先,我们来看`metadata-...

    JDBC元数据操作--DatabaseMetaData接口Demo

    DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文只讲解DatabaseMetaData接口获取元数据的方法。 文章地址:http://blog.csdn.net/chen_zw/article/details/18816599

    MP3格式解析

    随着技术的发展,现在还有更先进的元数据标准如Vorbis Comments和FLAC的METADATA BLOCK,但MP3的ID3标签仍然占据着重要的地位,尤其在处理大量的老式MP3文件时。因此,掌握MP3格式解析的知识,对于任何与音频处理...

    微软.NET核心文档(5/6)--《Metadata API(元数据API)》

    《Metadata API(元数据API)》是针对微软.NET Core运行时(CLR)元数据的创建和导入的API规范。这个API是非托管的,主要用于编译器、加载器和其他需要快速访问元数据、并且在遍历关系(如类层次结构)或操作集合(如...

    元数据概念以及原理应用全解析资源合集

    元数据(Metadata),即关于数据的数据,是对数据和信息资源进行描述的信息。通常认为,元数据是为了更为有效地管理和使用数据而对它进行说明的信息。所以元数据与其描述的数据内容有着密切联系,不同领域的数据的元数据...

    Flex中采用Flex-config.xml进行命令行的编译

    `&lt;keep-as3-metadata&gt;`可以保留AS3元数据,例如用于处理资源国际化的`Localize-behavior`。 博客链接中提到的`flex-config.xml`修改,可能涉及上述某一项或多项配置,具体修改需查看博主提供的具体内容。通常,...

Global site tag (gtag.js) - Google Analytics