我有Main.fla和SkinA.fla。两者都有MovieClip库项目:MC_BrandLogo
我正在将SkinA.swf加载到当前应用程序域中的Main.swf中,试图替换Main.swf中的类。如果Main.fla中没有库项,我可以用正确的图形实例化MC_BrandLogo。如果在Main.fla中已经存在MC_BrandLogo,那么即使我在当前应用程序域中加载了新图形,也会使用该图形。
有没有办法用动态加载来替换现有的链接影片剪辑?登记/>
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSkinLoaded);
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(new URLRequest("SkinA.swf"));
function onSkinLoaded(e:Event):void {
trace("loaded Skin");
addChild(new MC_BrandLogo());
}
编辑:没有办法覆盖我试图覆盖的图像,因为这是应用程序域的工作方式。如果父应用程序域中存在定义,则使用它们。
答案 0 :(得分:2)
击败拳头。我相信JonnyReeves是正确的。关于这个主题的一个很好的讨论可以在这里找到:
答案 1 :(得分:0)
据我所知,除非您希望诉诸manipulating bytecode at runtime,否则无法覆盖ApplicationDomain中的类定义。
但是,您可以将皮肤SWF加载到子应用程序域中,然后通过ApplicationDomain.getDefinition检索相应的类定义(符号);即:
private var _skinAppDomain : ApplicationDomain;
function loadSkin() : void {
// Keep a reference to the Skin's application domain.
_skinAppDomain = new ApplicationDomain();
var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext(false, _skinAppDomain);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSkinLoaded);
loader.load(new URLRequest("SkinA.swf"));
}
function onSkinLoaded(e:Event) : void {
var brandLogoSymbolName : String = "MC_BrandLogo";
// Retrieve the symbol from the Skin's Application Domain directly.
var brandLogoClipClazz : Class = _skinAppDomain.getDefinition(brandLogoSymbolName);
// Check we have the symbol.
if (brandLogoClipClazz == null) {
throw new Error("Skin SWF must include a symbol named: " + brandLogoSymbolName);
}
addChild(new brandLogoClipClazz());
}
要帮助调试ApplicaitonDomains中缺少的符号名称,您可以列出使用SWF Explorer包含的所有类定义(符号)。