Загрузка нескольких изображений в Air не работает должным образом? - PullRequest
0 голосов
/ 04 апреля 2011

Итак, я создал приложение для перетаскивания, в которое можно перетаскивать изображение, оно автоматически изменяет размер и сохраняет его на рабочем столе.

Но теперь я хочу сделать то же самое, когда несколько изображений перетащеныВот где я застрял ...

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 голосов
/ 05 апреля 2011

Похоже, что на загрузчики ссылаются только как на локальные переменные. После завершения функции 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);
...