ActionScript 3.0 对库资源的访问及操作

一.  Adobe Flash 编程中实例化对象的两种方法

  1.  直接在工程文件(FLA)中,将库中单个资源拖放到舞台,舞台上的一个对象即为一个对象实例

        2.  基于 ActionScript 的实例化可作为将单个资源拖放到舞台上的替代方法。

          第2中方法,在as编程中具有重要的意义,这个方面需要借助于 "为 ActionScript 导出库元件

           为 ActionScript 导出元件:

      1. 在“库”面板中选择该元件并打开其“元件属性”对话框。必要时激活“高级”设置。
      2. 在“链接”部分中,激活“为 ActionScript 导出”复选框。这将激活“类”和“基类”字段。 
        • 默认情况下,"类"字段会用删除了空格的元件名称进行填充(例如,名为“Tree House”的元件会变为“TreeHouse”)。
        • 若要指定该元件对其行为使用自定义类,请在此字段中输入该类的完整名称,包括它所在的包。
        • (不需要自定义行为): 如果希望在 ActionScript 中创建该元件的实例,但不需要添加任何其它行为,则可以使类名称保持原样。“基类”字段的值默认为 flash.display.MovieClip。
        • (自定义行为):如果想让元件扩展另一个自定义类的功能,可以指定该类的名称替代这个值,只要该类扩展 Sprite(或 MovieClip)类即可。
                   3. 按“确定”按钮以保存所做的更改。
此时,如果 Flash 无法找到包含指定类的定义的外部 ActionScript 文件(例如,如果不需要为元件添加其它行为),则会显示警告:
无法在类路径中找到对此类的定义,因此将在导出时自动在 SWF 文件中生成相应的定义

如果库元件不需要超出 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。你可以将基类改成这些默认基类的子类如(MyMovieClipMySimpleButtonMyFont,也可以改成默认基类的祖先类(没啥意义)。如果填入的基类名称不符合要求,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 编程》 

                             http://help.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8ea63-7fee.html


原文地址:https://www.cnblogs.com/yaozhongxiao/p/2137971.html