ActionScript 3菜单SWF加载与卸载异常问题求助
解决ActionScript 3中加载外部SWF后原内容未卸载的问题
嘿,很高兴能帮你搞定这个AS3的加载难题!你遇到的情况太常见了——加载外部SWF后原Menu的内容还留在舞台上,本质是因为你只是把新SWF“叠”上去了,没主动清理掉原来的显示对象。下面给你一套清晰的解决方案,分步骤来:
核心思路
不管是从Menu跳转到子SWF,还是从子SWF返回Menu,切换时先清空当前舞台/容器里的旧内容,再加载并添加新SWF。最好用一个专门的容器来承载外部SWF,这样管理起来更省心。
具体代码实现
1. Menu.swf的处理
首先给Menu里的所有内容(文本、按钮)套一个容器,这样清理时不用一个个删:
// 初始化一个容器放Menu的核心内容 var menuContainer:Sprite = new Sprite(); addChild(menuContainer); // 把你的menu文本、两个加载按钮都加到这个容器里(假设实例名分别是menuTxt、btnLoad1、btnLoad2) menuContainer.addChild(menuTxt); menuContainer.addChild(btnLoad1); menuContainer.addChild(btnLoad2); // 再初始化一个容器专门放外部加载的SWF var swfContainer:Sprite = new Sprite(); addChild(swfContainer);
然后写加载子SWF的按钮点击逻辑:
btnLoad1.addEventListener(MouseEvent.CLICK, loadSWF1); btnLoad2.addEventListener(MouseEvent.CLICK, loadSWF2); // 加载1.swf的函数 function loadSWF1(e:MouseEvent):void { // 先隐藏/移除Menu的内容 menuContainer.visible = false; // 或者直接removeChild(menuContainer),看你是否需要保留Menu实例 // 清空外部SWF容器的旧内容(防止重复加载) swfContainer.removeChildren(); // 开始加载外部SWF var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSWFLoaded); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onSWFLoadError); loader.load(new URLRequest("1.swf")); } // 加载完成后的处理 function onSWFLoaded(e:Event):void { var loadedSWF:DisplayObject = e.target.content; swfContainer.addChild(loadedSWF); } // 加载错误处理(可选但推荐) function onSWFLoadError(e:IOErrorEvent):void { trace("加载SWF出错:" + e.text); } // 加载2.swf的逻辑和上面基本一致,替换URLRequest的参数就行 function loadSWF2(e:MouseEvent):void { menuContainer.visible = false; swfContainer.removeChildren(); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSWFLoaded); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onSWFLoadError); loader.load(new URLRequest("2.swf")); }
2. 子SWF(1.swf/2.swf)的返回逻辑
以1.swf为例,返回按钮的逻辑要清理当前内容并加载Menu:
btnBack.addEventListener(MouseEvent.CLICK, backToMenu); function backToMenu(e:MouseEvent):void { // 清理当前SWF的内容(假设文本实例是txt1,返回按钮是btnBack) removeChild(txt1); removeChild(btnBack); // 加载Menu.swf var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMenuLoaded); loader.load(new URLRequest("Menu.swf")); } function onMenuLoaded(e:Event):void { // 将Menu添加到舞台,替换当前内容 stage.addChild(e.target.content); }
额外注意事项
- 实例名要正确:确保你在FLA里给所有文本、按钮都设置了正确的实例名,不然代码里找不到对象
- 内存管理:如果不再需要某个显示对象,除了移除,还可以设置为
null(比如menuTxt = null;),帮助Flash的垃圾回收清理内存 - 容器复用:用专门的容器承载外部SWF,能避免舞台上对象混乱,切换时只需要清空容器即可
- 错误处理:一定要加上加载错误的监听,不然加载失败时你不知道问题出在哪
这样处理后,点击按钮加载子SWF时,Menu的内容就会被隐藏/移除,不会再和新SWF的内容重叠啦!
内容的提问来源于stack exchange,提问作者Hélder Filipe Correia Carneiro
相关产品推荐
相关产品推荐

