2011-04-04 111 views
0

所以我做了一个拖放应用程序,我可以放在图像中,它会自动调整大小并保存在桌面上。在Air中加载多张图片无法正常工作?

但现在我要当有拖多幅图像做相同的。 这是我坚持......

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

它看起来像你的装载机只被引用为局部变量。功能onDrop结束后,可能会收集垃圾。一旦发生这种情况,他们将不会调用您的事件处理程序。你需要将它们保存在某个地方以保存它们的内存。

我会将它们保存在一个数组中。做一个私有变量的类,像这样:

private var _loaders:Array = []; 

然后,当你创建一个Loader,保存:

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

在你completeHandler,或徘徊无论你用装载机完成,一定要从阵列中删除它:

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

顺便说一句,这是一个常见的误解,即向调度程序添加事件侦听器会创建对调度程序的引用。不过,这是另一种方式。调度器保存对监听器的引用,并且没有对调度器的额外引用。 – joshtynjala 2011-04-05 19:57:24