zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    sqlplus时报Linux-x86_64 Error: 13: Permission denied
    thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 合并石子
  • 原文地址:https://www.cnblogs.com/yaozhongxiao/p/2137971.html
Copyright © 2011-2022 走看看