Browse > Home > Flex3 > 用Flex的编译参数实现AS3程序的自身预加载(Self Preloading)

| Subcribe via RSS

用Flex的编译参数实现AS3程序的自身预加载(Self Preloading)

四月 6th, 2009 | 2,333 views | Posted by flashlizi in Flex3

记得在很早的时候,我在blueidea上写过一个关于as3自身加载的帖子,基本思想和as2中的原理类似,而且还曾被人批评为帧的概念太根深蒂固,as3中要完全抛弃frame。今天,我的一个flashdevelop的as3项目需要做个loading,我不觉得一个小swf去加载大的swf文件是一种很好的loading解决方案。 因为用的是flex sdk,没法像flash CS3那样创建帧,又不想创建一个fla文件,所以原来的办法似乎没法用了。

于是我翻出以前bit-101上的一片经典的as3自身加载的文章:Preloaders in AS3,仔细看看后,发现原来的想法是正确的,只不过在flex中靠的是元数据标签Frame来增加一个工程关键帧类factoryClass,而这个类在flex项目中默认为mx.managers.SystemManager,并由此控制flex程序的preloading实现。说白了,就是flex程序的其实都是2帧,第一帧默认是SystemManager类的实例,第二帧才是我们的Application文档类mxml。再进一步查看flex的as3 compiler的源程序,也证实了这点。

可是,当我用元数据标签Frame来加入preloading的时候,编译后的swf文件尺寸陡增,原来当用元数据标签Frame加入factoryClass的时候,就会编译很多flex框架类到swf中来,显然这不是我所期望的,这个方法也行不通。但用双帧原理来做preloading是显然的,因此问题的关键便在于如何创建一个双帧的swf。

当我在flex的as3 compiler的源程序中寻找的时候,突然在flex的编译程序mxmlc的编译参数中看到了一个高级可选参数frames.frame,搜索后找到这个参数在flex-config.xml中的具体用法:
<frames>
      <!-- frames.frame: A SWF frame label with a sequence of classnames that will be linked onto the frame.-->
      <!-- frames.frame usage:
      <frame>
         <label>string</label>
         <classname>string</classname>
      </frame>
      -->
</frames>

这个参数用mxmlc的cmd命令行参数模式为:
-frames.frame label classname

于是我在flashdevelop的项目属性的compiler options里的Additional Compiler Options里加入是一个已有但并未编译到文档类里的类FrameTwoClass:
-frames.frame FrameTwoClass FrameTwoClass
果然,在编译后的swf文件的classes里可以看到一个Frame 2: FrameTwoClass的类,因此便很容易知道,这个参数可以帮我们创建帧并链接到一个指定的类。

到这里为止,我想大家应该都差不多已经知道怎么实现self preloading了吧。创建一个Preloading类并设置为文档类,把我们真正的主程序Application类用刚才的参数frames.frame编译到第二帧上。在Preloading类中用enterframe事件监听loaderInfo的bytesLoaded和bytesTotal从而显示加载进度,当加载完后,利用反射方法getDefinitionByName()来创建真正的主程序Application类的实例,大功告成!

点击查看 demo源文件

5 Responses to “用Flex的编译参数实现AS3程序的自身预加载(Self Preloading)”

  1. tcper Says:

    flash develop默认不就有这种模式吗?


  2. flashlizi Says:

    以前看过,以为和普通的一样,没注意有加入这个参数,确实有。谢谢。


  3. Morrisliang Says:

    其实还有一种方法,早些时候我在这里http://warwithinme.com/2010/04/preloader-in-pure-as3-project/写了。另外还有用Flash IDE制作preloader的方法。虽然都是大同小异。。


  4. flashlizi Says:

    看了你说的加include参数方法,其实原理和加frames参数以及flex的factoryClass是一样的。把主程序类编译进swf,在preloader类中通过反射再运行主程序类。


  5. Morrisliang Says:

    是啊,除了反射,没有其他方法使preloader减少体积了。include方法相对简单明了一点。


Leave a Reply