第三部分 Flash 的媒体组织方式(上)
一、资源管理
库(Library)是Flash文档的资源管理器,所有可被Flash利用的资源都可以放在库中,并接受库的管理。在使用Flash进行创作设计或软件开发之前,首先要将媒体内容添加至Flash文档,当然也可以在 Flash 中直接创建矢量图或文本。或者从外部导入矢量图、位图、视频和声音;可以创建元件,即可重用的媒体内容。在运行时,也可以使用脚本动态地将媒体内容添加至文档。
对于已经导入的媒体资源,Flash使用库(Library)对它们进行管理。从另外一个角度来说,库是用来存储已经导入的文件,并把它们作为可被重复利用的资源。从外部导入的文件和在Flash中直接绘制的图形是进行创作的基础。利用元件可以使用嵌套(nesting)的方式进一步组织这些媒体,使之成为独立但可重复利用的模块。元件包括:图形(Graphic)、按钮(Button)和电影剪辑(MovieClip)。库还可以包含添加到文档的组件(Component),组件作为编译好的剪辑显示在库中。不同的Flash文档间还可以进行库项目的交流,一个Flash文档可以打开另一个Flash文档的库,从中获取当前文档所需要的库项目,以实现资源的共享。库可以作为资源永久保存,Flash启动时被自动加载,Flash还提供了若干个范例库以供用户使用。
同时,库资源可以作为 SWF 文件导出到一个 URL,从而创建运行时共享库。这里需要涉及到两个概念:资源文档和目标文档。所谓目标文档是指当前正在编辑,需要利用共享库中的资源的文档,而资源文档是指已经被导出到某个URL的swf文件,用于存储库资源,供目标文档使用。这里的URL必须符合Flash Player 7安全沙箱的要求,简单地说,目标文档和资源文档在发布后必须位于同一个域名或指定域名下,然而这一点在本地调试时确实不受限制的。在本地运行的Swf或Exe文件也不受这个安全机制限制,可以直接使用运行时共享库中的资源。运行时共享库对于RIA开发非常有用,使库项目的开发和软件整体整合开发分离,并且共享资源库可以被多个目标文档所使用,提高了库项目资源的可复用性。
库还可以对库项目进行管理,创建文件夹对库项目进行分类,修改库项目的属性。被导入的资源可以在库中直接调用其它编辑程序进行编辑,编辑完成后Flash可以直接更新库中原来的项目。可以直接选中未使用的库项目,这样开发者便可以删除一些无用的库项目,精简库资源,使Flash文档更小。这里需要注意的是,一般情况下,未使用的库项目并不包含在发布后的Swf文档中,只有当库项目被导出为运行时共享库时,未使用的库项目才同时被导出到Swf文档中。
二、时间轴上对象的组织
对象在Flash中被称为实例(Instance),而库中的库项目通常被成为符号(Symbol),类似于通常面向对象编程中的类。所谓“时间轴上对象的组织”也即时间轴上实例的组织。
时间轴被分为很多的小格,连续的时间被离散化,每一小格对应了一个状态——Flash执行的状态,小格被称为:帧(Frame)。帧包括两种,关键帧(Key Frame)和普通帧(Frame)。在关键帧中可以放置内容,而普通帧则不允许放置内容,并且由Flash根据关键帧的内容自动生成。不同时间轴之间是相互独立的,它们的播放是互不影响的。这里需要指出的是,单帧的时间轴与多帧时间轴的区别,单帧的时间轴并不循环播放,而多帧的时间轴在没有脚本语句控制的情况下会连续循环地播放。
时间轴与时间轴之间的组织是一种树形结构,它们始终以一种嵌套(nesting)的方式进行组织。父时间轴包含了子时间轴,并可以相互引用和控制。主时间轴(_root)是这个树形结构的根节点。在任意节点下的子节点集合并非一直保持原有的状态,随着时间轴上播放头的推进,其子节点集合也在发生着变化,所以这棵树在时间上是一棵动态树。
正是由于这样一种组织方式,每一个对象都有一个路径指明对象在这棵树中的位置,以便脚本引用。路径包括绝对路径和相对路径。绝对路径从主时间轴开始;而相对路径由当前位置开始,例如MC._parent指MC的父时间轴。
Flash 时间轴的树形组织方式(1)
Flash 时间轴的树形组织方式(2)
对象的生存期和作用域在时间轴上被定义。首先,对象在关键帧中被创建,并在其后的普通帧中一直存在(电影剪辑、组件等对象还可以被脚本引用),直到遇到一个关键帧,对象被移除或被重新创建。如果前后两个关键帧中对象被赋的引用名不同,对象将被重新创建和初始化。多帧循环的时间轴在进行循环播放时,从最后一帧跳到第一帧时时间轴将被刷新,这与使用脚本语句进行播放控制的效果是一样的。时间轴被刷新后,时间轴上的所有对象将被清除,并重新创建。在后面将对时间轴刷新进行详细讨论。
事实上,Flash中对象的组织并不仅仅只是在时间轴的组织,深度(Depth)组织方式与时间轴组织一样重要。所以在单个的时间轴上,Flash的对象组织方式是二唯的,即时间轴方向和深度方向。
在大多数的可视化编程中,需要对屏幕上的对象进行组织。这种组织意味着各个可视对象在屏幕上的位置以及它们互相层叠的方式。在Flash中可视化屏幕对象可以是电影剪辑(MovieClip)、按钮(Button)、文本框(TextField)和组件(Component)。当使用Actionscript进行编程时可以使用一定的方式来控制他们的层叠方式,当然,在Flash的编辑状态下也可以使用菜单命令对屏幕对象的层叠方式进行调节。
在Flash 的编辑环境下,对象的组织方式是不严格的,使用Flash 脚本可以实现与编辑状态下一样的控制,它可以在程序中直接给出屏幕对象的组织方式。但是在脚本中,用户仅可以控制电影剪辑、按钮、非静态的文本对象以及组件,因为只有他们才是屏幕元素,可以被指定一个引用名,以便在Actionscrip中实现对他们的操作和控制,而其它的那些可视对象,例如静态文本、色块、线条始终位于编辑时的原始位置。值得指出的是,组件(Component)事实上是被编译后的电影剪辑,其行为特性与电影剪辑是类似的。
前面提到过,Flash的时间轴组织是一棵在时间轴方向上动态的树,并且主时间轴(_root)是这棵树个根节点。需要注意的是,这里所说的深度(Depth)并非树的深度。深度是对不同时间轴层次的描述,它表现在两个方面:对象在屏幕的显示层次(Z-Order)和对象的加载顺序(Load-Order)。另外时间轴在其父时间轴上有一定的生存期。因为时间轴往往包含在具体的对象中,所以其生存期的概念与对象生存期的概念是一致的。