我需要从XML加载一组图像并为其分配交互性
首先加载XML
import flash.display.Loader;
import flash.net.URLRequest;
var loader:Loader = new URLLoader();
var request:URLRequest = new URLRequest("myXML.xml");
loader.load(request);
loader.addEventListener(Event.Complete, proessFile);
function processFile(e:Event):void
{
var loadedXML:XML = (e.target.data);
}
//load set of images from XML file
for (var i:uint = 0; i < loadedXML.image.length(); i++)
{
var imgLoader:Loader = new Loader();
var imgRequest:URLRequest = new URLRequest (loadedXML.img[i].attribute("filepath"));
imgLoader.load(imgRequest);
addChild(imgLoader);
}
这里我需要让每个图像都可以拖动。是否可以将其更改为另一种数据类型,b / c我无法使用Loader?
我尝试过分配.name属性,但我以后无法打电话给他们。
我不知道如果我足够清楚,但基本上我需要将每个加载的图像作为新对象。是否可以为每个图像分配变量?
对此工作流程的任何建议都将非常感激。
答案 0 :(得分:2)
因为您将它们添加到舞台上,您可以尝试命名它们,然后通过舞台的getChildByName
方法调用它们。
或者你可以构建一个加载器数组,或者更好的是,构建movieClips。就像是: import flash.display.Loader; import flash.net.URLRequest;
var loader:Loader = new URLLoader();
var request:URLRequest = new URLRequest("myXML.xml");
loader.load(request);
var images:Array = new Array();
loader.addEventListener(Event.Complete, proessFile);
function processFile(e:Event):void
{
var loadedXML:XML = (e.target.data);
}
//load set of images from XML file
for (var i:uint = 0; i < loadedXML.image.length(); i++)
{
// create a new movie clip
var tmpMovieClip:MovieClip = new MovieClip();
var imgLoader:Loader = new Loader();
var imgRequest:URLRequest = new URLRequest (loadedXML.img[i].attribute("filepath"));
imgLoader.load(imgRequest);
// add the loader to the movie clip's display list
tmpMovieClip.addChild(imgLoader);
// add the movieclip to the previously declared array
images.push(tmpMovieClip);
}
这样,您可以在需要时调用并使用Array的任何元素。如果您不需要MoviClips,只需将Loader实例添加到Array中即可。
答案 1 :(得分:1)
我担心我无法理解你的一些问题。
是否可以将其更改为其他数据类型,b / c我无法使用Loader?
首先,您希望将其更改为哪种数据类型。第二,为什么你不能使用Loader?
我尝试过分配.name属性,但我以后无法打电话给他们。
你为什么要打电话给他们,你是怎么想的?
我需要将每个加载的图像作为新对象使用。
每个加载器对象都封装一个图像对象。图像实际上位于Loader内(.content
属性上)。
evilpenguin描述了如何在数组中存储对加载器对象的引用,以便以后可以访问它们。这是正确的基本方法。真正的问题是:“你到底想要做什么?”
你说:
这里我需要让每个图像都可以拖动。
如果它很简单,那么直接将事件添加到加载器(封装图像)。
for each(var image:XML in loadedXML.image)
{
var imgLoader:Loader = new Loader();
var imgRequest:URLRequest = new URLRequest(image.@filepath);
imgLoader.load(imgRequest);
addChild(imgLoader);
// NOTE: you may want to wait until it is done loading
// before you add drag and drop behaviour although
// that isn't strictly necessary
makeDraggable(imgLoader);
}
function makeDraggable(loader:Loader):void
{
loader.addEventListener(MouseEvent.MOUSE_DOWN, startDrag);
loader.addEventListener(MouseEvent.MOUSE_UP, stopDrag);
// NOTE: I'll leave it up to you to decide
// how you want to implement drag and drop
}
注意:我还将循环更改为使用E4X,这是在Actionscript中处理XML的一种很好的方法。
答案 2 :(得分:0)
要创建图像的“副本”,只需执行以下操作。
private function contentLoaderInfo_completeHandler(event:Event):void
{
var loaderInfo:LoaderInfo = event.target as LoaderInfo;
var originalBitmap:Bitmap = loaderInfo.content as Bitmap;
var newBitmap:Bitmap = new Bitmap(originalBitmap.bitmapData.clone());
images.push(addChild(newBitmap));
}
这样,您就可以完全脱离加载器对象并完全丢弃它们。显然,当evilpenguin建议您可以将它们添加到Sprites或MovieClip然后将它们添加到舞台(Bitmap类不是DisplayObjectContainer,因此您不能向它们添加额外的子项)。