有个问题想请教大家!我正在尝试为我的网站制作一个导航系统,其中每个导航项都作为外部 .swf 加载。感谢该站点上的另一个用户,我能够获得该功能。问题是我也想为这些外部 swfs 添加一个预加载器。
我正在使用的代码是这样的:
var loadedSWF:Loader = null;
/**
* Loads an SWF and adds it to container once complete
* @param file The URL to the SWF to load
* @param container The container to add the SWF to
*/
function loadSWF(file:String, container:MovieClip=null):void
{
if(container == null) container = MovieClip(root);
// removes the previously loaded SWF
if(loadedSWF != null)
{
if(loadedSWF.parent) loadedSWF.parent.removeChild(loadedSWF);
}
var req:URLRequest = new URLRequest(file);
loadedSWF = new Loader();
loadedSWF.load(req);
addChild(loadedSWF);
}
menu_mc.test_btn.addEventListener(MouseEvent.CLICK, _click);
function _click(e:MouseEvent):void
{
loadSWF("testmovie.swf");
loadedSWF.x = 0;
loadedSWF.y = 125;
var otherindex = getChildIndex(Border);
setChildIndex(loadedSWF, otherindex + 1);
}
到目前为止,我尝试过的一切都失败了。如果我不使用空加载器,我可以让预加载器工作,但是当我这样做时,我不确定如何让它删除加载另一个 .swf 时正在使用的资产 - 一切都只是堆积和陷入网站. 如果我尝试将附加到上述代码的预加载器放在一起,则会出现错误,因为我正在调用空对象。很抱歉成为这样的新手,我才刚刚开始接触闪光灯。我很感激任何帮助!
编辑:这里快速浏览一下我有些混乱的版本,其中包括一个预加载器,但由于空加载器而无法工作:
var loadedSWF:Loader = null;
/**
* Loads an SWF and adds it to container once complete
* @param file The URL to the SWF to load
* @param container The container to add the SWF to
*/
function loadSWF(file:String, container:MovieClip=null):void
{
if(container == null) container = MovieClip(root);
// removes the previously loaded SWF
if(loadedSWF != null)
{
if(loadedSWF.parent) loadedSWF.parent.removeChild(loadedSWF);
}
loadedSWF.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
loadedSWF.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete);
var req:URLRequest = new URLRequest(file);
loadedSWF = new Loader();
loadedSWF.load(req);
function loadProdComplete(e:Event):void {
trace("swf file loaded");
//remove the preloader from container clip
removeChild(preLoader);
// add the loaded swf to container clip
addChild(loadedSWF);
currentSWF = MovieClip(loadedSWF.content);
currentSWF.gotoAndPlay(1);
currentSWF.addEventListener(Event.ENTER_FRAME , checkLastFrame);
function checkLastFrame(e:Event):void {
if (currentSWF.currentFrame == currentSWF.totalFrames) {
currentSWF.stop();
// trace("stopped");
}
}
}
var preLoader:loader = new loader();
//position the loading bar
preLoader.x = 155;
preLoader.y = 185;
addChild(preLoader);
function onProgressHandler(event:ProgressEvent){
var dataAmountLoaded:Number=event.bytesLoaded/event.bytesTotal*100;
preLoader.bar.scaleX = dataAmountLoaded/100;
preLoader.lpc.text= int(dataAmountLoaded)+"%";
trace(preLoader.bar.scaleX );
}
}
var currentSWF:MovieClip = new MovieClip();
menu_mc.test_btn.addEventListener(MouseEvent.CLICK, _click);
function _click(e:MouseEvent):void
{
loadSWF("testmovie.swf");
loadedSWF.x = 0;
loadedSWF.y = 125;
var otherindex = getChildIndex(Border);
setChildIndex(loadedSWF, otherindex + 1);
}
编辑#2:功能代码,但现在每当我点击按钮时都会收到以下输出错误。swfs 加载和卸载很好,但如果有人知道我可以如何清理它以避免输出错误,我希望它尽可能平滑!:
ArgumentError:错误 #2025:提供的 DisplayObject 必须是调用者的子对象。在 Flash.display::DisplayObjectContainer/removeChild() 在 MethodInfo-8()
var container:MovieClip = new MovieClip();
var currentSWF:MovieClip = new MovieClip();
var swfLoader:Loader = new Loader();
function launchSWF(vBox, vFile):void{
//vBox.addChild(swfLoader);
var swfURL:URLRequest = new URLRequest(vFile);
swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete);
swfLoader.load(swfURL);
function loadProdComplete(e:Event):void {
trace("swf file loaded");
vBox.removeChild(preLoader);
vBox.addChild(swfLoader);
currentSWF = MovieClip(swfLoader.content);
currentSWF.gotoAndPlay(1);
currentSWF.addEventListener(Event.ENTER_FRAME , checkLastFrame);
function checkLastFrame(e:Event):void {
if (currentSWF.currentFrame == currentSWF.totalFrames) {
currentSWF.stop();
// trace("DONE");
}
}
}
var preLoader:loader = new loader();
preLoader.x = 155;
preLoader.y = 185;
vBox.addChild(preLoader);
function onProgressHandler(event:ProgressEvent){
var dataAmountLoaded:Number=event.bytesLoaded/event.bytesTotal*100;
preLoader.bar.scaleX = dataAmountLoaded/100;
preLoader.lpc.text= int(dataAmountLoaded)+"%";
trace(preLoader.bar.scaleX );
}
}
test_btn.addEventListener(MouseEvent.CLICK, _load);
function _load(e:Event):void{
swfLoader.unloadAndStop();
var swfFile:String = 'test.swf';
launchSWF(container, swfFile);
//put it on stage
addChild(container);
}