1. 直接在工程文件(FLA)中,将库中单个资源拖放到舞台,舞台上的一个对象即为一个对象实例
2. 基于 ActionScript 的实例化可作为将单个资源拖放到舞台上的替代方法。
第2中方法,在as编程中具有重要的意义,这个方面需要借助于 "为 ActionScript 导出库元件"
为 ActionScript 导出元件:
- 在“库”面板中选择该元件并打开其“元件属性”对话框。必要时激活“高级”设置。
- 在“链接”部分中,激活“为 ActionScript 导出”复选框。这将激活“类”和“基类”字段。
- 默认情况下,"类"字段会用删除了空格的元件名称进行填充(例如,名为“Tree House”的元件会变为“TreeHouse”)。
- 若要指定该元件对其行为使用自定义类,请在此字段中输入该类的完整名称,包括它所在的包。
- (不需要自定义行为): 如果希望在 ActionScript 中创建该元件的实例,但不需要添加任何其它行为,则可以使类名称保持原样。“基类”字段的值默认为 flash.display.MovieClip。
- (自定义行为):如果想让元件扩展另一个自定义类的功能,可以指定该类的名称替代这个值,只要该类扩展 Sprite(或 MovieClip)类即可。
如果库元件不需要超出 MovieClip 类功能的独特功能,(没有自定义的行为和属性) 则可以忽略此警告消息。
----------------------------------------------------------------------------------------------------------------------------------
相关文章: 关于“为Actionscript导出” 与 “在第一帧导出” : http://uh.9ria.com/space-28025-do-blog-id-10553.html
在fla文件的库里,每个元件(确切地说是按钮和影片剪辑)的属性面板中,都有“为Actionscript导出”和“在第一帧导出”两个选项。一直都不知道这两个 选项是什么意思,只知道在某些时候需要勾选这两项,具体是什么时候也不得而知,只是将就着用了。现在,是时候深入了解这两个选项了。
这两个选项之间的关系: 勾选“为ActionScript导出”项后,“在第一帧导出”项才变成可选。也就是说,只有需要“导出”时,才需要考虑 “在第几帧 导出”。
什么时候才需要勾选“为ActionScript导出”选项?
我们在fla文件的库中存放按钮和影片剪辑这些元件,然后把按钮和影片剪辑拖放到动画的各个帧上。这可以看做是按钮和影片剪辑实例化的过程。
除了通过“拖放”来实例化库中的元件以外,有时候,我们需要在ActionScript代码中动态地实例化这些元件。这时,元件的“为ActionScript导出”选项就 派上用场了。
究竟导出什么了?
导出的当然是可以在ActionScript中使用的类了。可以这么理解:我们把元件导出成一个类,这个类的类名和基类是我们自定义的。实例化这个导出的类,就相当于实例化该类对应的元件了。
勾选元件的“为ActionScript导出”选项后,会看到如下界面。我们在这里自定义导出的类的名称和基类。然后,我们就可以在ActionScript代码中通过这个类名访问这个类了。( 顺便提一下,图中的“标识符”在ActionScript3中已经不再使用。)
“导出”选项对编译的影响
需要澄清的一点是,勾选了这个选项后,并不意味着此元件和它对应的类文件一定会被编译到swf文件里。因为“类只有被用到,才会被编译”。比如说,你把某元件导出成一个类,但是在你的fla文件中并没用到该类,那这类和对应的元件都不会被编译到swf文件中。这和import语句有点类似,import了某个类,但是又没有使用这个类,那这个类也是不会被编译到swf文件中的。关于编译,后面再细说,我们回到刚才的主题。
自定义导出的类的名称和基类
即使不填写导出类的名称,编译时也不会出错。Flash IDE会自动创建一个不知名的类(扩展自指定的基类)。既然不知道类名,也就没有办法在ActionScript代码中访问这个类了。所以,勾选了“为ActionScript导出”选项,又不填写类名的做法是没有意义的。
如果填写了导出类的名称,但是此名不指向任何实际存在的类,编译也不会出错。Flash IDE会自动创建一个类(扩展自指定的基类),类名就是我们填写的名称。既然有了类名,我们就可以在ActionScript代码中使用这个类了。
如果填写的名称不符合类名规范(例如使用中文),编译时也不会出错。Flash IDE处理的方式估计和不填写名称类似。
如果导出类的名称指向一个实际存在的类,那实例化的就是这个实际存在的类了。可以把该类看做是元件的“文档类”。
至于基类,如果导出的是影片剪辑,则它的默认基类是MovieClip,如果导出按钮,则它的默认基类是SimpleButton,如果导出的是字形,默认基类是Font。你可以将基类改成这些默认基类的子类如(MyMovieClip、MySimpleButton、MyFont),也可以改成默认基类的祖先类(没啥意义)。如果填入的基类名称不符合要求,Flash IDE会将基类自动纠正回默认基类。
编译
关于编译,上面提到过“只有被用到,才会被编译”。还有一句,“只有被编译,才能被使用”。
先解释一下怎样才叫“被用到”。以下的这些都是“被用到”的实例。
l 元件被拖到场景时,此元件导出的类就“被用到”了。
l 在ActionScript代码中实例化某类,那这个类也“被用到”了。
l 在ActionScript代码中,尝试访问某类的引用,那这个类也“被用到”了。
在应用程序中,往往会有一些这样的类:在应用程式初始化时,不会用到这些类。当应用程序运行到某个阶段,或者用户进行了某个操作后,才会用到这些类。这样的类在初始化时,就应该被编译到swf中,供以后使用。
怎样才能把这些类强迫编译到swf文件中呢?很简单,强迫这些类 “提前被用到一下”就可以了。下面的操作任选其一即可:
l 将类对应的元件拖一个到场景中,把它放在视窗范围之外。
l 在ActionScript代码中New 个实例出来。(不需要添加到DisplayList中)
l 在ActionScript中引用一下类名,如trace(ClassName)。
这些办法都是可以的,但是问题是太不优雅了。上面的操作其实都是和应用程序无关的,很容易被误解或误删。特别是那些有洁癖的Code,肯定是接受不了这样的做法。还好Flash IDE有比较优雅的办法,那就是“在第1帧导出”选项。
“在第1帧导出”选项: 先说明两个问题:1:这里说的第1帧是在哪个时间轴上的?;2:干嘛非得在第1帧导出,在第N帧导出不行?
这里说的第1帧是在哪个时间轴上的?
分析如下:
1. 类的导出是全局性的,所以这里说的时间轴应该是全局性的时间轴;(比较牵强)
2. 如果说是某个MovieClip的时间轴,那在元件的属性面板中勾选该选项时,应该让我们选择对应的MovieClip啊。
3. 更不可能是父影片剪辑的时间轴了,因为一个元件可以实例化到N多父影片剪辑里,那究竟是在哪个镜片剪辑的第一帧导出呢?
通过以上3点,基本可以确定这里说的主场景的时间轴。
在第N帧导出行不行?
行的。在fla文件的属性面板中,点击“编辑Actionscript设置”按钮,打开“Actionscript 3.0 设置”面板,修改“导出帧中的类”的值即可。然后,你打开任意一个元件的属性面板,会发现“在第1帧导出”都变成了“在第【你修改的数值】帧导出”。不过这个值是全局的,一旦改了,会影响到所有的元件。不能实现元件A在第1帧导出类,而元件B在第2帧导出类。
该选项调整的是导出时间点
举个例子:如果你把某元件设置成在第2帧导出,那么在主场景指针没有走到第2帧之前,我们是访问不到该元件导出的类的。也就是说,该选项调整的是导出类的可访问时间点。导出的类当然是越早能访问到越好了,所以,设置成“在第一帧导出”是比较保险的做法。
上述例子,你可以在第1帧用getDefinitionByName(“ClassName”)函数进行验证。注意不能用trace(ClassName)函数验证,因为用该函数验证时,必须引用这个类,而引用这个类即表示该类被提前“用到了”,那该类就会提前被导出了,你在元件属性面板中设置的数字就不起作用了。
在不同的帧导出会影响编译的swf文件大小吗?
在第1帧导出和在第N帧导出编译成的swf文件大小是有差别的,但是差别不大。在我做的试验中,只有几百字节的差别,而且“在第一帧导出”编译出来的文件比在“在第N帧导出”编译出来的文件要小。
问题又来了。既然在“在第1帧导出”既保险,生成的文件又小,那还有“在第N帧导出”什么事啊?Flash IDE提供这样的设置目的是什么呢?究竟在什么情况下才使用这个设置呢?
相关问题:“在第2帧导出”解决preloading问题
如果你把preloading写在当前文件的第一帧上(as2时代流行的做法),如果你的元件在第一帧导出太多的类,或者场景的第一帧上有太大的内容(图片、音频、视频),都会影响preloading的运行。问题的表现是:白屏,等待,然后加载进度不是从1%开始。
问题的原因是:帧代码在帧初始化完毕后才开始执行。如果场景的第一帧上有元件实例,那就需要加载元件和对应的类,才能实例化;如果在第一帧导入元件的类,那就需要加载元件和对应的类,这两种加载都会阻塞帧代码的执行。
解决办法:
1)不在当前文件实现加载,而是用一个空文件在加载当前文件。
2)第一帧只实现preloading,其他什么都不做。把所有的元件设置为第二帧导出,然后在第二帧及后续帧实现动画。
----------------------------------------------------------------------------------------------------------------------------------
====================================================================================
参考资料:1. 《Adobe ActionScript 3.0 编程》