AS3将类分配给XML Loaded元素

时间:2009-08-12 10:22:28

标签: xml flash actionscript-3 loader

我需要从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属性,但我以后无法打电话给他们。

我不知道如果我足够清楚,但基本上我需要将每个加载的图像作为新对象。是否可以为每个图像分配变量?

对此工作流程的任何建议都将非常感激。

3 个答案:

答案 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,因此您不能向它们添加额外的子项)。