您是否因为 SWF 位于 Web 服务器上而预加载?如果是这样,一种选择是从服务器预加载字节,而不使用URLLoader实际解释它们。稍后,当您需要显示 MovieClip 时,使用Loader.loadBytes将预加载的字节 (URLLoader.data) 注入 Loader以实际实例化 MovieClip(并开始播放、声音和所有内容)。在实例化时可能会有一个小的延迟,但它会比没有预加载器的情况要少得多。
根据您关于 loader.content 类型的问题:
package
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.utils.getQualifiedClassName;
public class tst extends Sprite
{
[Embed(source="any_image.png", mimeType="application/octet-stream")]
private var img_bytes:Class;
[Embed(source="any_swf.swf", mimeType="application/octet-stream")]
private var swf_bytes:Class;
public function tst():void
{
var b1:ByteArray = new img_bytes();
var l1:Loader = new Loader();
l1.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace(getQualifiedClassName(l1.content));
trace(l1.content is Bitmap);
});
l1.loadBytes(b1);
var b2:ByteArray = new swf_bytes();
var l2:Loader = new Loader();
l2.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace(getQualifiedClassName(l2.content));
trace(l2.content is MovieClip);
});
l2.loadBytes(b2);
}
}
}
(注意:这只是演示性代码 - 不要使用这样的函数闭包添加事件侦听器,这会导致内存泄漏。我也跳过了 URLLoader 并简单地嵌入以获取我的字节,但它们也是相同的字节方式)。
输出是:
flash.display::Bitmap
true
test_fla::MainTimeline
true
但是,Bitmap 和 MovieClip 不是 loader.content 的唯一选项 - 加载从代码编译的 SWF 可以从 Sprite 派生,并且可能显示完全限定的类名,尽管正如 www0z0k 指出的那样,它们都是从 DisplayObject 派生的。虽然我相信任何来自 Flash Professional 的 SWF 输出总是来自 MovieClip。
根据您的说明,Loader 字节始终是 MovieClip
事实证明你是对的 - 一个加载常规旧图像的加载器,contentLoaderInfo.bytes 属性包含生成的 SWF 的字节,该 SWF 是一个简单的 MovieClip 包装器,图像作为子级。谁会猜到?!
var l3:Loader = new Loader();
l3.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace("- l3:");
trace(getQualifiedClassName(l3.content));
trace(l3.content is Bitmap);
// This ByteArray is a SWF!
var b3:ByteArray = l3.contentLoaderInfo.bytes;
var l4:Loader = new Loader();
l4.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void {
trace("- l4:");
trace(getQualifiedClassName(l4.content));
trace(l4.content is Bitmap);
trace(Object(l4.content).getChildAt(0) is Bitmap);
});
l4.loadBytes(b3);
addChild(l4);
});
l3.load(new URLRequest("any_image.png"));
输出是:
- l3:
flash.display::Bitmap
true
- l4:
flash.display::MovieClip
false
true