当您将SWF加载到另一个SWF时,加载程序SWF可以使用ApplicationDomain.getDefinition(name:String)
从加载的SWF中获取特定定义。例如:
package
{
// ... imports
public class SWFLoader extends Sprite
{
private var loadedAppDomain:ApplicationDomain;
public function SWFLoader()
{
var request:URLRequest = new URLRequest("test.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete);
loader.load(request);
}
private function onTestLoadComplete(event:Event):void
{
var loaderInfo:LoaderInfo = LoaderInfo(event.target);
loadedAppDomain = loaderInfo.applicationDomain;
// Here we can get ANY defined symbol (class, namespace or function according to Adobe Flash help)
var someSymbolClass:Class = Class(loadedAppDomain.getDefinition("SomeSymbol"));
var someSymbolSprite:Sprite = Sprite(new someSymbolClass());
addChild(sprite);
}
}
}
如何在SWF中获取所有定义,而无需明确指定每个定义?
答案 0 :(得分:14)
从Flash Player 11.3开始,您可以使用ApplicationDomain.getQualifiedDefinitionNames()
。
请参阅the official documentation for the method和this blog post about the Flash Player release。
答案 1 :(得分:10)
编辑:这是解决问题的最快方法:http://www.bytearray.org/?p=175
您好,您可以使用此库:https://github.com/claus/as3swf/wiki/ 没有时间做更深入的测试,但这是我发现的:
1 - 我创建了一个包含在库2中的.swf导出的MC,$ Test和$ Test2 2 - 一旦加载器加载了.swf,我运行以下代码:
var swf : SWF = new SWF(loader.contentLoaderInfo.bytes);
trace(swf);
3 - 在输出中你会注意到这些行:
[76:SymbolClass]
Symbols:
[0] TagID: 2, Name: $Test2
[1] TagID: 1, Name: $Test
我认为有一种方法可以通过库API直接获取此信息
答案 2 :(得分:0)
您必须将加载的SWF放在当前的ApplicationDomain中。
使用ApplicationDomain.currentDomain在ContextLoader信息上执行此操作。
loader.load(request, new ContextLoader(false, ApplicationDomain.currentDomain));
它应该有用。
答案 3 :(得分:-1)
我从几天前在这里问过的上一个问题得到了答案(这是关于SWC,但在你的情况下,它并没有真正有所作为) Working with SWCs - getDefinitionByName issue
如果两个SWF共享相同的ApplicationDomain,您应该能够直接访问加载的SWF类:
//provided that SomeSymbol extends Sprite...
var someSymbolSprite:Sprite =new SomeSymbol();
另一方面,你将无法做到这一点
var SomeSymbol:Class = getDefinitionByName("SomeSymbol");
除非您从加载的SWF中创建对象库
var ssym:SomeSymbol;
查看以上链接了解更多详情。