当SWFLoader外部加载SWF时一切都很简单,可以直接通过SWFLoader实例的content属性获取加载的SWF相关的主类Sprite/MovieClip实例。
<s:SWFLoader id="swfLoader" source="@Embed(source='assets/xxx.swf')" />
但当SWFLoader如上所示,source属性使用@Embed标签嵌入swf时,该SWFLoader的content就不再是swf本身所代表的Sprite或MovieClip了,而是一个MovieClipLoaderAsset类的子类实例,源代码如下
package xxx.xxx { import mx.core.MovieClipLoaderAsset; import flash.utils.ByteArray; public class main__embed_mxml_assets_xxx_swf_666811031 extends MovieClipLoaderAsset { public function main__embed_mxml_assets_xxx_swf_666811031() { super(); initialWidth=11000/20; initialHeight=8000/20; } private static var bytes:ByteArray = null; override public function get movieClipData():ByteArray { if (bytes == null) { bytes = ByteArray( new dataClass() ); } return bytes; } [Embed(_resolvedSource='X:/xxx/xxx.swf(swf在硬盘上的绝对路径)', mimeType='application/octet-stream')] public var dataClass:Class; } }
由上可见,该MovieClipLoaderAsset子类实例有一个名为dataClass的Class类型的public变量,使用Embed标签嵌入了swf(作为二进制数据ByteArray)
[Embed(_resolvedSource='X:/xxx/xxx.swf(swf在硬盘上的绝对路径)', mimeType='application/octet-stream')] public var dataClass:Class;
可以通过名为movieClipData的getter获取swf的ByteArray。
另外MovieClipLoaderAsset类实例还有一个私有的loader:Loader变量
private var loader:Loader
该loader加载了嵌入的swf,并作为MovieClipLoaderAsset子类实例的唯一子项添加到了其显示列表中
也就是说swfLoader.content.getChildAt(0) as Loader,即可得到该私有变量loader,
这个loader.content才是嵌入swf相关的主类Sprite/MovieClip
其实Flex 4.5及以后版本提供了一个MovieClipSWFLoader类,和SWFLoader一样支持@Embed嵌入swf,通过 get movieClip 属性可以获取加载或者嵌入的MovieClip(但对于属于Flex程序的SWF也就是ISystemManager实例会返回null)
还提供跟MovieClip一样的常用影片剪辑操作方法如play(),stop()等。需要注意的是,即使是嵌入的SWF在MovieClipLoaderAsset中也是用Loader加载了ByteArray然后解码的,也就是说,需要一段加载时间后,movieClip才能返回嵌入的影片剪辑对象,在加载完成前,都会返回null。