Flex 4 获取SWFLoader嵌入的SWF实例

当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。

你可能感兴趣的:(swf,嵌入,SWFLoader)