在Air中加载多张图像不能正常工作?

时间:2011-04-04 15:51:45

标签: flex image actionscript air load

所以我制作了一个拖放应用程序,我可以在其中放入图像,它会被调整大小并自动保存在桌面上。

但是现在我想在拖入多个图像时也这样做。 这就是我被困的地方......

private function onDrop(e:NativeDragEvent):void
{
    trace("Dropped!");
    var dropfiles:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
    for each (var file:File in dropfiles){

        var ldr:Loader = new Loader();
        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

        switch (file.extension.toLowerCase()){
            case "png" :
                ldr.load(new URLRequest(file.url));
                trace('png');                     
                break;
            case "jpg" :
                ldr.load(new URLRequest(file.url));
                trace('jpg');
                break;
            case "jpeg" :
                ldr.load(new URLRequest(file.url));
                trace('jpeg');
                break;
            case "gif" :
                ldr.load(new URLRequest(file.url));
                break;
            default:
                Alert.show("Kies een geldige afbeelding!");
        }
    }
}

private function completeHandler(event:Event):void {
    var ldr:Loader = Loader(event.target.loader);
    var b:Bitmap = Bitmap(ldr.content);
    var encoder:PNGEncoder = new PNGEncoder();
    var bytes:ByteArray = encoder.encode(resizeimage(b.bitmapData, 600, 600));

    //new FileReference().save(bytes, "abc.png");
}

问题是我希望completeHandler()在每个ldr.load()之后运行,但是在我的代码中它只在每个循环之后运行一次。

有谁知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

看起来你的Loaders只被引用为局部变量。函数onDrop结束后,它们可能正在收集垃圾。一旦发生这种情况,他们就不会调用您的事件处理程序。你需要将它们保存在某处以保持记忆。

我将它们保存在一个数组中。在你的班级上创建一个私有变量,如下所示:

private var _loaders:Array = [];

然后,当您创建Loader时,保存它:

var ldr:Loader = new Loader()
_loaders.push(ldr);

在您的completeHandler中,或者在您完成Loader之后,请务必将其从数组中删除:

var index:int = _loaders.indexOf(ldr);
_loaders.splice(index, 1);