2

我有 Main.fla 和 SkinA.fla。两者都有 MovieClip 库项目:MC_BrandLogo。
我正在将 SkinA.swf 加载到当前应用程序域中的 Main.swf 中,试图替换 Main.swf 中的类。如果 Main.fla 中没有库项目,我可以用正确的图形实例化 MC_BrandLogo。如果 MC_BrandLogo 已经存在于 Main.fla 中,那么即使我在当前应用程序域中加载了新的图形,也会使用该图形。

有没有办法用动态加载替换现有的链接影片剪辑?

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());
}

已编辑:无法覆盖我试图覆盖的图像,因为这是应用程序域的工作方式。如果定义存在于父应用程序域中,则使用它们。

4

2 回答 2

2

被一拳打死。我相信 JonnyReeves 是正确的。可以在此处找到有关此主题的良好讨论:

Senocular 上的应用领域

于 2012-02-05T11:10:24.913 回答
0

据我所知,除非您希望在运行时处理字节码,否则您不能覆盖 ApplicationDomain 中的类定义。

但是,您可以将皮肤 SWF 加载到子应用程序域中,然后通过ApplicationDomain.getDefinition检索适当的类定义(符号) ;IE:

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包含的所有类定义(符号) 。

于 2012-02-05T11:08:22.557 回答