所以我制作了一个拖放应用程序,我可以在其中放入图像,它会被调整大小并自动保存在桌面上。
但是现在我想在拖入多个图像时也这样做。 这就是我被困的地方......
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()之后运行,但是在我的代码中它只在每个循环之后运行一次。
有谁知道我在这里做错了什么?
答案 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);