0

我需要从 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 属性,但以后无法调用它们。

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

对这里的工作流程的任何建议将不胜感激。

4

3 回答 3

2

因为您将它们添加到舞台,您可以尝试命名它们,然后通过舞台的getChildByName方法调用它们。

或者,您可以构建一组加载器,或者更好的是,movieClips。类似于:import flash.display.Loader;导入 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 的任何元素。如果您不需要 MoviClip,您只需将 Loader 实例添加到数组中即可。

于 2009-08-12T10:38:03.260 回答
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 的一种非常好的方法。

于 2009-08-12T13:34:53.583 回答
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 或 MovieClips,然后将它们添加到舞台(Bitmap 类不是 DisplayObjectContainer,因此您不能向它们添加额外的子级)。

于 2009-08-13T11:21:13.727 回答