标题：flash组件
Flash 组件概述‍
组件是带有参数的电影剪辑，这些参数可以用来修改组件的外观和行为。每个组件都有预定义的参数，并且它们可以被设置。每个组件还有一组属于自己的方法、属性和事件，它们被称为应用程序程接口（Application Programming Interface，API）。使用组件，可以使程序设计与软件界面设计分离，提高代码的可复用性。Flash MX 2004 或 Flash MX Professional 2004 中包含的组件不是 FLA 文件，而是 SWC 文件。SWC 是用于组件的 Macromedia 文件格式。库项目中的电影剪辑可以被预编译成swf文件。这样可以缩短影片测试和发布的执行时间。将 SWC 文件拷贝到 First Run\Components目录后，该组件便会出现在“组件”面板中。
组件基类‍
Flash 自带的组件都位于mx.controls包中。组件直接或间接继承于UIComponent类，UIComponent类对UIObject类做了扩展，而UIObject类又是MovieClip类的子类。MovieClip类不属于任何包，定义文件位于FlashInstalDir\en\First Run\Classes目录。UIComponent类和UIObject类都位于mx.core包中，定义文件位于FlashInstalDir\en\First Run\Classes\mx\core目录。 
UIObject类对MovieClip类进行封装，所有Flash V2组件都可以共享它的方法、属性和事件。UIObject类使组件在样式、事件和缩放比例调整上得到了实现。它提供了动态创建删除组件的方法： 
·createObject方法：直接调用attachMovie函数，返回一个MovieClip类型的引用。 
·createClassObject方法：调用createObject方法，创建一个指定类的组件实例，并返回所创建的组件的引用。 
·createEmptyObject方法：创建一个空的UIObject实例。 
·destroyObject方法：使用delete语句删除已经创建的组件实例。 
UIObject还封装了其它的一些方法，包括： 
·redraw方法：在当前帧重新绘制组件。 
·invalidate方法：标记组件，使之在下一个帧间隔重新绘制。 
·move方法：把组件移动到指定位置。 
·setSize方法：设置组件大小。 
·setSkin方法：设置组件皮肤。 
·getStyle方法：获取样式信息。 
UIObject类的属性除了scaleX和scaleY外，其它都是只读属性，使用时需要注意。所以如果要在运行时调整组件外观，就必须使用UIObject类的方法。对于只读属性的赋值是无效的，即使是对非只读属性的赋值，有时也会造成组件在外观显示上的差错。UIObject类还定义了一系列的事件，包括加载事件（load）、卸载事件（unload）、移动事件（move）、重绘事件（draw）和大小调整事件（resize）。 
利用UIObject类的组件创建方法，可以在运行时创建组件实例。 
UIComponent类从UIObject类继承，它并不是一个可视的组件。和UIObject类一样，所有Flash V2组件都可以共享它的方法和属性。它实现了组件的焦点获取、键盘输入，组件的禁用和启用以及组件的按布局调整自动大小。 
UIComponent类的主要方法有： 
·getFocus方法：利用焦点管理器（Selection）返回一个当前获取焦点的对象的引用。 
·setFocus方法：使组件获取焦点。 
UIComponent类的enabled属性指定组件实例是否可用；tabIndex属性指定组件的焦点获取顺序。UIComponent类还定义一系列焦点和键盘事件：焦点获取事件（focusIn），焦点转移事件（focusOut）、键盘按下事件（keyDown）和键盘释放事件（keyUp）。
Flash V2 组件的基本使用方法‍
在Flash MX 2004和 Flash MX Professional 2004自带了一套组件称为Flash V2组件，它是从Flash MX的V1组件升级而来的，V1组件和V2组件尽量不要一起使用以免发生一些错误。V2组件支持实时预览，使开发者在编辑状态下就能看到组件的外观效果。开发者可以自行设置是否需要实时预览和实时预览的模式，以节省计算机资源。在ControlàEnable Live Preview菜单设置是否使用实时预览，在ViewàPriview Mode菜单选择预览模式。组件实质上是一些被编译好的电影剪辑，其格式为SWC。SWC文件类似与Zip文件，可以使用一般的解压缩程序进行解压查看其内容。电影剪辑可以在编辑环境中直接发布为组件，也可以直接编译存储为swc格式的组件文件，便于其他开发者使用。同样，开发者也可以从外部导入组件。 
使用组件，必须把组件面板中所需要的组件拖到舞台（Stage），使组件出现在库面板。这样组件就可以象普通的库项目一样被使用。使用脚本可以动态的创建组件实例，运行时创建组件可以有三个方法：createObject()、creatClassObject()和attachMovie()。attachMovie()是MovieClip类的方法，createObject()和creatClassObject()是UIObject类方法，但事实上它们都是对attachMovie()的直接或间接调用。 
组件被添加后可以在属性或参数面板中直接设置组件的参数。另外还要为组件定义事件，最简单的方法是使用on(eventName)进行定义。另外还可以使用侦听器和事件处理函数等定义组件事件的处理方法。组件的事件定义比较灵活，使用何种方式定义取决与个人的习惯与偏好。当事件发生时，组件会广播一个Object类型的事件参数，该参数中包括了事件发生对象和事件类型的信息。另外，使用深度管理器（DepthManager）可以对组件进行深度管理。 
Flash组件最大的特点是开发者可以自定义组件，尤其是界面元素的自定义，使其更具有吸引力。V2组件有它自己的一套默认界面方案，称为主题（Theme）。主题包括两个方面：样式（Style）和外观（Skin）。UIObject类的setStyle()和getStyle()方法可以获取和设置组件的样式。样式的设置比较简单，主要有以下三种方式： 
·直接设置属性： 
T.color=0xff5567; 
·使用简单的setStyle()名值对方法自定义样式： 
instanceName.setStyle("property", value); 
·把样式对象与setStyle()方法结合使用来自定义样式： 
//创建一个样式对象 
var styleObj = new mx.styles.CSSStyleDeclaration; 
//刻画样式细节 
//…… 
styleObj.fontSize = 18; 
//把样式应用到组件实例 
b.setStyle("styleName", styleObj); 
样式的级别包括4个层次：全局样式，应用于所有组件；组件类单独的默认样式，应用于某一类的组件；自定义样式；直接设置组件实例的属性。对于不同级别的样式Flash按照一定的顺序分别把这些样式应用到组件。 
首先，Flash 查找组件实例上的样式属性，如果实例上没有直接设置样式，Flash 将查看实例的styleName 属性，确定是否向它分配了样式声明。如果 styleName 属性没有被分配样式声明，Flash 将查找默认类样式声明上的属性。如果没有类样式声明，并且属性没有继承它的值，则将检查 _global 样式声明。如果属性未在 _global 样式声明中定义，则该属性为 undefined。 
另外，如果没有类样式声明，但属性确实继承了它的值，Flash 将查找该实例父级上的属性。如果属性未在父实例上定义，Flash 将检查父实例的 styleName 属性；如果未定义该属性，Flash将继续查看父实例，直到 _global 级别。如果属性未在 _global 样式声明中定义，则该属性为undefined。 
另一方面，为了更好的使用组件，还需要修改或重新定义组件外观。Flash V2的外观定义文件位于FlashInstralDir\en\First Run\ComponentFLA文件夹下。在修改外观时，需要把原始的外观定义文件作为外部库导入（FileàOpen External Library），并把外部库中的外观定义库项目拖到当前文档的库中，外观库项目通常都是电影剪辑（MovieClip）。每一个组件外观定义库项目文件夹中都包含一个States文件夹，其中定义了组件在不同状态下的外观，每一个状态都指定了一个链接名（linkageName）作为脚本引用，如果修改了这个名称，则会使组件在该状态下的外观加载发生错误。在组件的类文件中，每一个状态都使用一个字符串属性指定其外观库项目的链接名，如果要重新定义组件某一状态下的外观，只要在脚本中修改这个字符串属性的值就可以了，当然首先必须存在可链的新的外观库项目。 
了解了这样一个组件外观机制以后，组件外观的修改就变的非常简单。其关键就是修改或重新定义一组新的外观库项目并指定其链接名，然后修改组件类文件中指定组件外观的属性。开发者可以在组件实例的初始化事件（initialize）中修改组件实例的外观。修组件所有实例外观的方法比较多，例如_root的第一帧使用ClassName. prototype.stateName=value语句，该语句也可以直接在#initclip和#endinitclip代码块中使用；另外还可以使用类继承的方式，在组件初始化时就为组件外观链接属性指定新的值，这里也需要用到#initclip、#endinitclip代码块。#initclip和#endinitclip是Flash的编译器命令，作为初始化代码块的开始标记和结束标记。只要符号（symbol）被定义，那么初始化代码就被先于第一帧执行，而且紧执行一次。所以在这个代码块中，可以为整个组件类指定不同状态下的外观。