代码之家  ›  专栏  ›  技术社区  ›  dd .

AS3将类分配给XML加载的元素

  •  0
  • dd .  · 技术社区  · 17 年前

    我需要从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?

    我试过分配它们。命名财产,但我后来无法给他们打电话。

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

    如果您对这里的工作流程有任何建议,我们将不胜感激。

    3 回复  |  直到 17 年前
        1
  •  2
  •   evilpenguin    17 年前

    因为你把他们添加到舞台上,你可以试着给他们命名,然后通过舞台的 getChildByName 方法

    或者你可以制作一系列的加载程序,或者更好的是,制作电影唇。比如: 导入flash。陈列装载机; 导入flash。网请求;

    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);
    }
    

    这样,您可以在需要时调用并使用数组中的任何元素。如果不需要MoviClips,可以将加载程序实例添加到数组中。

        2
  •  1
  •   James Fassett    17 年前

    恐怕我很难理解你的一些问题。

    是否可以将其更改为另一种数据类型,b/c我无法使用Loader?

    首先,您希望将其更改为什么数据类型。第二,为什么不能使用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的一种非常好的方法。

        3
  •  0
  •   enzuguri    17 年前

    要创建图像的“副本”,只需执行以下操作。

    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建议的那样,您可以将它们添加到Sprite或MovieClips中,然后将它们添加到stage中(Bitmap类不是DisplayObjectContainer,因此您不能向它们添加额外的子对象)。