用Flex的编译参数实现AS3程序的自身预加载(Self Preloading)
http://www.riaidea.com/blog/archives/191.html
好像flashdevlop默认有预先加载
记得在很早的时候,我在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 类的实例,大功告成!