Flash MX的新功能增强了Flash的易用性、创造性和功能性。新功能中内置的代码引用以及预定义组件最方便最实用。Flash MX组件引用了我们在VB中熟悉的控件概念,替代和扩展了Fash5中的智能剪辑(Smart Clip),学过VB编程的人很轻易上手。Flash MX的组件给用户带来了很大的自由空间,让我们可以编写属于自己的客户组件,从而使Flash MX具有了无限的可扩展性。
下面我们就来一起开发一个“倒计时器”组件,这个组件的功能是:在屏幕上显示一个倒计时数,当倒计时结束时,运行指定的程序。用户可以自己设置倒计时多少秒、显示的颜色以及倒计时结束后运行的程序。具体步骤如下:
一、创建电影剪辑
按(Ctrl+F8)新增一个名为fuyzTimer的电影剪辑,在电影剪辑的编辑窗口中建一个文本框,在属性检查器中将其设置为“动态文本”并命名为myText,设置文本框的关联变量为sec。(如图1)。注重后面的代码都是在这个电影剪辑内部的第一帧上的。
创建好电影剪辑后我们就可以自定义组件了,为了方便大家对后面内容的理解,这里先介绍“面向对象”编程的基本概念──“类”、“对象”、“属性”、“方法”及“封装”。
二、“面向对象”编程(OOP)的基本概念
1.“类”和“对象”
对现实中的某种具体物质进行抽象、概括后就叫“类”,某种类的具体存在就叫“对象”。举几个实际例子,比如:将具体的各式各样的桌子进行抽象概括就成了“桌子”这个“类”,而具体的“一张课桌”、“一张餐桌”等则是“桌子”这个“类”的对象。再如“奔驰轿车”就是“轿车类”的一个对象。
2.类的属性和方法
由于类是对某一种具体物质抽象,也就是说,某种类就一定具有区别于其他类的独立性质,这些性质就叫做类的“属性”。以“桌子类”为例来说明:桌子有哪些区别于其他类的属性呢?桌子的属性至少有:大小、颜色、高度、材料、外形等等。定义一个“类”后都必须给它指定属性,大多数情况下都为公有(Public)属性,也有私有(Private)属性。
类的方法是类响应某个事件时所做的事情。例如:当转动钥匙启动汽车时将触发一个事件,这时汽车已定义的一个方法“启动”将起作用来发动汽车。从编程的角度看,类的“方法”实际上就是函数,不过,这个函数不同于一般高级语言中的函数,他只能在所在的类中使用,不能在其他地方任意使用,所以方法成员又叫“类函数”。在面向对象程序设计中,一般将类函数统称为“函数”,其他非类函数统称为“全局函数”。
3.类的封装
类的封装就是将类的信息(它的属性)和类对事件的响应(它的方法)都包含在类的定义中。
三、定义组件类
自定义组件的过程主要有以下三个步骤:
(1) 自定义组件类。
(2) 为类添加成员和方法。
(3) 将组件注册(register)给组件类。
我们先介绍定义自定义组件类。自定义组件类是自定义组件的要害。FlashMX新增加了自定义组件的指令#initclip #endinitclip。这两个指令本质上看是用来封装一个组件类的,即将一个组件类的属性和方法都包含在组件类的定义中,也就是将组件类的属性和方法都放在#initclip和#endinitclip之间,因而#initclip和 #endinitclip总是同时出现,这有点像Html的标签。组件类定义的全部代码都包含在这一对代码中间。#initclip,#endinitclip代码块在.swf文件反复的播放中只执行一次,代码块在.swf文件中的任何元素载入时间轴前就已经运行了,这与flash5中在播放头运行时的代码执行有所不同。
下面这段程序定义一个名为fuyzTimerClass的组件类。
function fuyzTimerClass() {
_timerLoop = function () {
if (getTimer() - this . oldtime>=1000) {
this . oldtime = getTimer();
this . sec = _formatvalue(Number(this . sec)-1)
if (Number(this . sec)<=0 ) {
this . sec = " ";
delete this . onEnterFrame;
this . runHandler();
}
}
};
_formatvalue = function (fno) {
if (String(fno) . length<2) {
return fno="0"+fno;
}
return fno;
};
this.init();
this.timerStart();
}
这段程序中还定义了_timerLoop和_formatvalue两个私有方法Private Method。“类”有两种形式的成员—公有(Public)成员和私有(Private)成员。类的公有成员(也包括公有数据和公有函数)可以被其他类的成员访问。当然,类自己的函数可以访问自己的公有成员。类的私有成员(包括私有数据和私有函数)只限于类本身的成员使用。也就是说,除了本身的成员能够访问自己的私有成员外,其他任何类以外的函数对私有成员的访问都是非法的。私有成员也不能被子类直接继续。在Flash MX中私有成员同类一同定义,名称前有一短的下划线“-”;公有成员则一般使用构造器函数的prototype属性定义。私有方法_timerLoop的作用是每过一秒将变量sec减1并判定变量sec是否到零,若到零则调用runHandler();私有方法_formatvalue的作用是当变量sec为一位数时在其前面补加零,即:将“9”变为“09”。
四、为类添加成员和方法
所有定义组件类的构造器函数都有 prototype 属性,该属性是在定义该函数时自动创建的。prototype属性代表用该函数创建的对象的默认属性值。可以使用 prototype 属性将属性和方法分配给类。可以给函数的Prototype定义一个新的函数,语法如下:
myfunction.prototype..myevent = function () {...}
注重prototype是必须的。
下面是为fuyzTimerClass 类添加的成员和方法:
fuyzTimerClass.prototype.init = function() {
this.oldtime = getTimer();
this.sec = _formatvalue(this.fsec); //读入用户设置的倒计时秒数
this.myText.textColor = this.txtColor; //读入用户设置的文本颜色
this.timerDirChange();
};
fuyzTimerClass.prototype.runHandler = function() {
this._parent[this.timeupHandler]();
}; //倒计时完后运行指定程序
fuyzTimerClass.prototype.timerStart = function() {
this.onEnterFrame = _timerLoop;
}; //控制倒计时器开始
fuyzTimerClass.prototype.timerPause = function() {
delete this.onEnterFrame;
}; //控制倒计时器暂停
fuyzTimerClass.prototype.timerReset = function() {
this . init();
}; //控制倒计时器重新开始
fuyzTimerClass.prototype.timerSetTime = function(secVar, setDefault) {
this.sec = _formatvalue(secVar);
if (setDefault) {
this.fsec = secVar;
}
}; //设置倒计时秒数
五、将组件注册(register)给组件类
为类添加完方法后,用下面的语句将组件注册给组件类。
Object.registerClass("fuyzTimer", fuyzTimerClass);
这是Flash MX新增加的用于自定义组件的函数,作用是使fuyzTimerClass类与所在的组件挂接,使组件不是MovieClip的直接对象,而是从新的类实体化得到的。fuyzTimer是组件的一个linkage ID,打开linkage属性面板(右键点击库中的三角形电影剪辑,选择linkage)按图2定义。
六、定义组件参数
好了,自定义组件的代码我们已经写好了,但定义组件的过程还没有完,这个组件还不能用,我们必须对这个电影剪辑(这个时候还是一个电影剪辑,还不是组件)做一些参数的设置。过程如下:
右键点击库中的fuyzTimer组件,打开组件定义面板(Component Definition),如图3:
你可以点击 “+”或“-”图标添加参数或删除参数,开始参数设置。你可以设置变量名字(Name),变量(Variable),数值(value)和数值类型(Type)。设置内容如下表。
名 称 变 量 值 类型
开始的秒数 fsec 0 数字
显示的颜色 txtColor #000000 颜色
执行的程序 timeupCandler 默认
其中,“变量“一栏中的“fsec”、“txtColor”和“timeupCandler”是我们在前面程序中用到的。用户在使用组件时只能看到“名称”和“值”两栏。“值”一栏不用设置,设置好“类型”即可。
在前面的定义组件面板上还有“自定UI”、“实时预览”和“说明”三项可设置,说明如下:
自定UI:给组件提供一个外部的.swf文件链接,这个文件可以显示在属性监视器中,改变.Swf文件中的参数,可以直观的反映组件的外观。
实时预览:和自定UI相似,给组件提供一个外部的.swf文件链接,这个.swf文件可以不通过播放器直接在源文件中显示组件的外观和功能,真正做到所见即所得。
说明:说明组件的功能,作者和版权等相关信息。说明的下面有个按钮,按下它可以为你的组件选择一个图标。如没有合适的可以自创一个图标。
七、自创组件图标
自创组件图标的方法如下:
用图形处理工具(Photoshop ,Fireworks),绘制一个大小为20—24px像素的图形,图形格式为GIF或PNG的透明色。在Flash MX 中导入该图形,图形自动存在库中。新建一个文件夹,命名FcustomIcons,把图形拖到这个文件夹内,并给图形命名fuyzTimer Component(注重文件夹是必须的,文件夹的命名也是唯一的,图形的名称必须和组件的名称相同),这样组件的缺省图标被自创的图标替代(假如看不到的话,关闭库面板,再重新打开),这是一个很有意思的能表现组件作者个性的的设置。
至此,我们的倒计时组件的制作工作已经全部结束了。现在我们的组件已经可以用了。按“Ctrl+L”打开库,将fuyzTimer组件拖到场景的第一帧上,在属性检查器中设置组件属性,在场景的第一帧上增加倒计时结束后调用的函数代码,即可欣赏到我们的成果了。
还有一个问题:在组件面板中还见不到我们的fuyzTimer组件,这是因为组件还没有安装(或者说还没有把这个组件的.fla文件放在正确的文件夹内)。安装的方法请继续看“Flash MX 组件的打包和发布”。
八、Flash MX 组件的打包发布
安装组件的方法有两种:
1.直接将组件的.fla文件放在正确的文件夹内
对Windows 2000 或 XP的用户将组件文件放在C:\Documents and Settings\User\Application Data\Macromedia\FlashMX\Configuration\Components\路径下;对Windows 98 and ME的用户则放在C:\Windows\Application Data\Macromedia\Flash MX\Configuration\Components\路径下(注重是源文件而不是生成文件)。在这些路径下你还能看到其他组件的源文件。这里有个小技巧:在这些路径下通过双击打开组件源文件来打开Flash MX,这时对组件进行的外观(Skins)修改将会保存下来。另外,打开组件源文件一般会看到此组件应用的实例,这对你学会此组件的使用是有帮助的。
2.创建标准的MXP插件
由于Flash MX支持标准的MXP插件封装格式,因此我们可以将测试无误的组件封装成标准的MXP插件,将它与其他朋友共享。
创建MXP的第一步是预备好和组件的 .fla文件相应的MXI文件。MXI文件包含了关于此组件的说明和相关信息,此文件要求为标准的XML格式,主要内容如下:
<macromedia-extension
name="fuyzTimer"
version="1.1.1"
type="Flash Component">
<!-- List the required/compatible products -->
<products>
<product name="Flash" version="6" primary="true" />
</products>
<!-- Describe the author -->
<author name="傅永忠" />
<!-- Describe the extension -->
<description>
<![CDATA[
这是一个倒计时器,可以设置倒计时秒数、显示时的颜色及倒计时结束后运行的程序名。
]]>
</description>
<!-- Describe where the extension shows in the UI of the product -->
<ui-access>
<![CDATA[
This component set will be installed into the Flash MX > Components folder.
]]>
</ui-access>
<!-- Describe the files that comprise the extension -->
<files>
<file name="fuyzTimer.fla" destination="$flash/Components" />
</files>
</macromedia-extension>
编写这个MXI文件可以用Dreamweaver MX ,保存时注重存为MXI文件。这里我向你推荐另一个编写MXI的工具MXI File Creator,它是一个Windows桌面应用程序,专门用来创建和编辑Macromedia Flash MX Extensions(.mxi),其界面如图4:
下载地址:http://www.muzakdeezign.com/mxi_creator/download.asp
创建MXP的第二步双击编写好的MXI文件,启动“Macromedia扩展治理器”按提示操作即可,但要将MXI文件和组件文件放在同一目录下。
至此,组件的开发工作全部结束。对此组件有爱好请和我联系。