我最近开始学习AS3,我决定用它创建一个投资组合网站。我正在从外部XML文件加载有关我创建的网站的信息。
一切都运作良好但是当我将新图片加载到舞台上时,前一张图片仍然存在,在我的理解中它不应该发生。正如我在Adobe的AS3指南中所理解的那样,一旦你创建了一个新的加载器实例,就应该删除前一个。
我一直在寻找一个解决方案,但我找不到一个可行的方案。我尝试使用.unload类,我也尝试了removeChild,但它一直给我错误。
这是我一直在使用的代码:
import fl.transitions.Tween;
import fl.transitions.TweenEvent;
import fl.transitions.easing.*;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.filters.*;
import flash.display.MovieClip;
import flash.events.MouseEvent;
var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = new XML();
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("portfolio.xml"));
function LoadXML(e:Event):void {
xmlData = new XML(e.target.data);
ParsePortfolio(xmlData);
}
function ParsePortfolio(siteInput:XML):void {
var titleList:XMLList = siteInput.Site.title;
var servicesList:XMLList = siteInput.Site.services;
var urlList:XMLList = siteInput.Site.url;
var picList:XMLList = siteInput.Site.picture;
var XX:Number = 0;
var titleElement:XML = titleList[XX];
var servicesElement:XML = servicesList[XX];
var urlElement:XML = urlList[XX];
var picElement:XML = picList[XX];
container_mc.title_txt.text = (titleElement);
container_mc.services_txt.text = (servicesElement);
var pictureNumber:String = picElement;
var my_loader:Loader = new Loader();
my_loader.load(new URLRequest(pictureNumber));
container_mc.pictureFrame.addChild(my_loader);
next.addEventListener (MouseEvent.CLICK, NbuttonClicked);
prev.addEventListener (MouseEvent.CLICK, PbuttonClicked);
function NbuttonClicked(e:Event):void {
var t1:Tween = new Tween (container_mc, "alpha", Strong.easeOut, 1, 0, .2, true);
t1.addEventListener(TweenEvent.MOTION_FINISH, dropbomb);
function dropbomb() {
XX++;
if (XX == titleList.length()) {
XX = 0;
}
var titleElement:XML = titleList[XX];
var servicesElement:XML = servicesList[XX];
var urlElement:XML = urlList[XX];
var picElement:XML = picList[XX];
container_mc.title_txt.text = titleElement;
container_mc.services_txt.text = servicesElement;
var pictureNumber:String = picElement;
trace(pictureNumber);
var my_loader:Loader = new Loader();
my_loader.load(new URLRequest(pictureNumber));
container_mc.pictureFrame.addChild(my_loader);
visit.addEventListener (MouseEvent.CLICK, VbuttonClicked);
function VbuttonClicked(e:Event):void {
navigateToURL(new URLRequest(urlElement), "_blank");
}
var t2:Tween = new Tween (container_mc, "alpha", Strong.easeOut, 0, 1, .2, true);
}
}
function PbuttonClicked(e:Event):void {
var t3:Tween = new Tween (container_mc, "alpha", Strong.easeOut, 1, 0, .2, true);
t3.addEventListener(TweenEvent.MOTION_FINISH, dropbomb);
function dropbomb() {
if ( XX == 0 )
{
XX = (titleList.length()) - 1;
}
else {XX--;}
var titleElement:XML = titleList[XX];
var servicesElement:XML = servicesList[XX];
var urlElement:XML = urlList[XX];
var picElement:XML = picList[XX];
container_mc.title_txt.text = titleElement;
container_mc.services_txt.text = servicesElement;
var pictureNumber:String = picElement;
var my_loader:Loader = new Loader();
my_loader.load(new URLRequest(pictureNumber));
visit.addEventListener (MouseEvent.CLICK, VbuttonClicked);
function VbuttonClicked(e:Event):void {
navigateToURL(new URLRequest(urlElement), "_blank");
}
var t4:Tween = new Tween (container_mc, "alpha", Strong.easeOut, 0, 1, .2, true);
}
}
}
手动将影片剪辑添加到舞台。我不知道这是否导致了这个问题,或者它是否完全不相关。
更具体的说,当container_mc淡出时,您可以看到上一张图片,显示它们正在堆叠而不是被替换。
我真的很感激一些帮助,至少我想知道我做错了什么,并指出了正确的方向。
我很抱歉这个愚蠢的代码和愚蠢的问题,但我真的看了很多答案,我已经找到了创建XML幻灯片的教程,到目前为止没有任何帮助我。
答案 0 :(得分:1)
当您实例化(并在其上调用addChild
)加载程序时,它会被添加到显示列表中。然后必须将其删除以停止在显示列表中。您可以使用动态Loader.load()
在其上调用URLRequest
,而不是反复实例化加载程序。这样,你只需要坚持使用一个每次调用它时都会改变的加载器。
例如:
import flash.events.Event;
import flash.display.Loader;
import flash.net.URLRequest;
var _loader:Loader = new Loader();
var _toLoad:URLRequest = new URLRequest("path.jpg");
_loader.load(_toLoad);
addChild(_loader);
loadImage("1.jpg");
function loadImage(path:String):void
{
_toLoad = new URLRequest(path);
_loader.load(_toLoad);
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleted, false, 0, true);
}
function loadCompleted(evt:Event):void
{
trace("load completed");
}