熟悉微软开发的各种软件(如Word, Excel, PowerPoint, Visual Studio等)的人亮一点又很快暗下去。天变得真快,我俯下身子往盆子里盛水,阳台防盗栏杆外已经飘起了雨。盆子在阳台的右角,雨水先落大概都知道“宏”吧?软件的使用者可以把一个操作序列录制成“宏”并保存起来,之后便可以通过运行宏来重复录制好的操作。Office套件各软件中的宏其实是VBA(Visual Basic for Application)代码,熟悉VB的话还可以自己编写或修改宏来实现更复杂的操作。

最近由于工作需要,开始接触Flash开发。我们的Flash项目中内容非常多,而且经常需要对一大堆类似的元件进行同样的操作。由于没有找到录制宏的菜单项,一开始的时候,所有的重复操作都需要手工一个一个进行,非常麻烦。

到后来,类似的重复劳动越来越频繁,而这样的重复劳动既乏味又容易出错。我开始觉得,应该不单是我们觉得这样的重复劳动很麻烦吧,Adobe公司对这样的事情也许有解决方案的。于是,我开始到处找资料,最后终于找到了方法。

在Flash CS3 Professional中,有个"命令(Command)"菜单,打开菜单后可以看到一些“命令”,以及管理命令,运行命令等菜单项。其实“命令”便等同于Word等软件中的“宏”,Flash中没有直接提供录制“命令”的方法,不过它提供了更灵活的创造“命令”的方法。

通过“窗口(Window)” -> “其他面板(Other Panels)” -> “历史(History)”打开“历史”面板,可以看到历史操作列表,在Flash中进行各种操作时,这个历史操作列表也在不断的增加新的纪录,而且Flash的“撤销(Undo)”和“重做(Redo)”都是基于这个历史操作列表进行的。

历史面板的右下角有一个小小的磁盘图标,按下这个图标变可以把选中的操作(可以有多个,并可以不连续)保存为命令了。保存的命令可以在“命令”菜单中找到。

Flash中的命令都保存在了扩展名为“.jsfl”的文件中,在Flash安装目录下对应语言的子目录(简体中文版为zh_cn,英文版为en)中“First Run\Commands”目录中可以找到录制的“命令”对应的文件。这些文件是JavaScript脚本,可以看到基本上都是由fl.getDocumentDOM()打头的,也就是几乎所有的操作都是通过Flash自己的DOM(文档对象模型)来进行的。历史面板的右下角,磁盘图标的左边,有一个“复制”图标,可以将选中的操作对应的JavaScript代码拷贝到剪贴板。

举个例子,选中一个文本框,将其字体设置为“Times New Roman”,粗体,设置行间距为5,左边距为3。从历史面板中可以看到对应的操作,将其拷贝后粘贴到文本编辑器中可以看到以下内容:

fl.getDocumentDOM().setElementTextAttr('face', 'Times New Roman');
fl.getDocumentDOM().setElementTextAttr('bold', true);
fl.getDocumentDOM().setElementTextAttr('lineSpacing', 5);
fl.getDocumentDOM().setElementTextAttr('leftMargin', 3);

如果需要对许多文本框做相同的设置,可以将这些操作保存为命令,然后每次只要选中需要设置的文本框(可以多个),然后运行命令便可以了。

如果懂得JavaScript语言,熟悉Flash的DOM之后,便可以使用命令来做更复杂的事情了,也可以极大程度地减少重复劳动。比如说,将许多mp3文件加入到Flash文件的库中,如果需要使用ActionScript来播放这些声音的话,需要对库中的这些声音项设置“为ActionScript导出”,通常是用鼠标右键单击库中的声音,右键菜单中选择“链接(Linkage)”,再在弹出的对话框中选中相应的复选框,然后确认。麻烦的是,这种操作一次只可以对一个声音项进行。我曾经重复对数十个声音项一个一个逐一设置过,按鼠标按到手软。

通过编写.jsfl文件,便再也不需要这样的重复劳动了,下面就是我编写的一个.jsfl文件,通过“运行命令(Run Command)...”菜单项运行它,可以对当前Flash文件的库中所有声音项设置“为ActionScript导出”并且“在第一帧导出”,如果声音项在库中的名称有扩展名,在链接标识符去掉其扩展名。

var lib  = fl.getDocumentDOM().library;
for (var i=0; i< lib.items.length; i++) { var obj = lib.items[i]; if (obj.itemType == "sound") {
obj.linkageExportForAS = true; obj.linkageExportInFirstFrame = true;
var idt = obj.name;
// 去除扩展名 var pos = idt.lastIndexOf('.'); if ( pos != -1) { idt = idt.substring(0, pos); }
// 去除目录名 pos = idt.lastIndexOf('/'); if ( pos != -1) { idt = idt.substring(pos+1); }
obj.linkageIdentifier = idt;
} }

从上面的例子可以看出,使用JavaScript编写一段简单的“命令”程序,便可以减少大量重复的手工劳动。

标签:, , , ,