2011-04-04 49 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