一.MXML工作原理
前面我们学习了MXML的基本知识,但是MXML是怎么工作的呢?其实MXML最后都会通过一定的规则编译成AS3的形式,简单来说是其中MXML的文件名会成为AS3中的类名,MXML中的property会成为child,attribute会成为对象的属性,id会成为类的属性,下面将详细说明:
我们知道flex sdk下framework文件夹下有个flex-config.xml文件,通过修改这个文件我们可以定制Flex编译的行为。
将这个文件中的keep-generated-actionscript设置为true,我们将可以看到MXML文件生成的AS3代码。
例如我们定义如下的Main.mxml文件
<?xml version="1.0" encoding="utf-8"?> <local:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:as="flash.text.*" width="200" height="200" > <local:RectComp id="myrect" width="100" height="100" /> </local:Application>
这里我们先避免使用Spark和MX命名空间中的类以简化问题。
我们使用自定义的两个类
[DefaultProperty( "children" )] [Bindable] public class Application extends Sprite { private var _width:Number; private var _height:Number; public function Application() { super(); opaqueBackground = 0xffffff; } public function set children( value:Vector.<DisplayObject> ):void { if (_width>0 && _height>0 && (super.width != _width || super.height != _height) ){ this.graphics.beginFill(opaqueBackground); this.graphics.drawRect(0, 0, _width, _height); this.graphics.endFill(); super.width = _width; super.height = _height; while ( numChildren > 0 ) { removeChildAt( 0 ); } for each ( var child:DisplayObject in value ) { addChild( child ); } if (super.width != _width) { super.width = _width; } if (super.height != _height) { super.height = _height; } } override public function set width(w:Number):void { if (this.numChildren > 0) { super.width = w; } _width = w; } override public function set height(h:Number):void { if (this.numChildren > 0) { super.height = w; } _height = h; } }
public class RectComp extends Shape { public function RectComp() { this.graphics.beginFill(0x000000); this.graphics.drawRect(0, 0, 100, 100); this.graphics.endFill(); } }
Flex将为我们生成一个Main类
public class Main extends Application { // instance variables [Bindable] public var myrect : RectComp; public function Main() { super(); // properties this.width = 200; this.height = 200; this.children = new <flash.display.DisplayObject>[_Main_RectComp1_i()]; } private function _Main_RectComp1_i() : RectComp { var temp : RectComp = new RectComp(); temp.width = 100; temp.height = 100; myrect = temp; mx.binding.BindingManager.executeBindings(this, "myrect", myrect); return temp; } }
可以看出,其中Main类名和MXML文件名对应。Main继承自local命名空间下的Application,与MXML的root tag对应。MXML中的id:myrect成了Main类中的属性,Application下的property成了Main类的child,attribute都成了对象的属性。
二.MXML的标签
MXML还有如下的一些标签:
fx:Binding 可以使用<fx:Binding> 标签将某个对象的数据绑定到另一个对象。 fx:Component 可以使用<fx:Component>标签在MXML文件中定义内联单元格渲染器或单元格编辑器。 fx:Declarations 可以使用<fx:Declarations>标签声明当前类的非默认、不可视属性。 fx:Definition 可以在<fx:Library>标签内使用<fx:Definition>标签定义图形子对象,然后可以将子对象用于应用程序的其他部分中。 fx:DesignLayer <fx:DesignLayer>标签仅供内部使用。 fx:Library 可以使用<fx:Library>标签声明当前类的非默认、非可视属性。 fx:Metadata 使用<fx:Metadata>标签可以在MXML文件中插入metadata标签。 fx:Model 可以使用<fx:Model>标签在MXML中声明数据模型。 fx:Private 可以使用<fx:Private>标签提供有关MXML或FXG文档的元数据信息。 fx:Reparent 作为视图状态更改的一部分,可以使用<fx:Reparent> 标签更改某个组件的父容器。 fx:Script 可以使用<fx:Script>标签定义ActionScript代码块。 fx:Style 可以使用<fx:Style>标签定义适用于当前文档及其子项的样式。
三.flash的大小
flash的大小和代码中用到的类库大小有关,因为Spark和MX类库功能比较多,所以其类库也比较大,所以用这些类库的话会造成生成的flash比较大,一个空的Spark的Application用release编译也有200多k。而在使用类库的时候,涉及到的类越多,最后生成的flash就会越庞大。
比如假如MXML文件里已经有了一个label对象,再增加一个label对象基本对生成的flash文件大小没有影响,但是如果增加一个原来没有的button对象,将会使flash文件增加10多k。
所以当我们使用Flex时,如果功能比较简单,尽量不要使用Spark和MX类库,如果需要使用Spark和MX类库,尽量用少一些的类的种类。