Не удается получить данные файла из буфера обмена с помощью Flex - PullRequest
1 голос
/ 12 февраля 2009

Дано: Flex TileList со следующим событием:

<mx:nativeDragDrop>
  <![CDATA[
    if(event.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
      var files:Array = event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;

      for each(var file:File in files)
      {
        // file.data is null here!
      }

      this.listData.refresh();
    }
  ]]>
</mx:nativeDragDrop>

Я пытаюсь создать список миниатюр из JPEG, которые я перетаскиваю в этот TileList. Image.source может использовать URL, чтобы показать изображение, но мне нужно сначала уменьшить изображение (привет, фото). Я уже сделал масштабирование, за исключением того, что мне нужен BitmapData из файла, и он имеет значение null для file.data.

ТАКЖЕ, я пробовал это:

var x:URLRequest = new URLRequest(value.file.url); // this is a local file (e.g. file:///C:/somefile.jpg)
var b:Bitmap = new Bitmap(x.data as BitmapData);

данные ТАКЖЕ нулевые! Так расстраивает. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 12 февраля 2009

Я предполагаю, что это часть приложения AIR. (Доступ к буферу обмена из простого приложения Flex невозможен.)

У меня нет опыта работы с AIR, но ваш второй кодовый блок явно неверен. Экземпляр URLRequest сам по себе ничего не делает, это всего лишь статический объект, хранящий детали запроса. Чтобы получить данные с этого URL, вам нужно создать Loader и передать запрос этому загрузчику следующим образом:

var req:URLRequest = new URLRequest(value.file.url); // this is a local file (e.g. file:///C:/somefile.jpg)
var ldr:Loader = new Loader();
ldr.addEventListener(Event.COMPLETE, function(event:Event):void {
   var b:Bitmap = event.target.content as Bitmap;
});
ldr.load(req);

Конечно, вам нужно заполнить обработчик Event.COMPLETE. Обратите внимание, что класс Loader можно использовать для загрузки объектов SWF и изображений, для всего остального вам придется использовать URLLoader и самостоятельно анализировать данные.

Что касается блока nativeDragDrop, вот фрагмент из документации :

Обычно это обработчик для nativeDragEnter или nativeDragOver событие оценивает данные перетащил вместе с действиями перетаскивания разрешено, чтобы определить, является ли Интерактивный объект может принять падение. Чтобы указать, что интерактивный объект является приемлемой целью, событие Обработчик должен вызвать NativeDragManager.acceptDrop () функция, передавая ссылку на предмет. Если пользователь отпускает кнопка мыши над обозначенным объект, объект становится каплей цель и отправляет Событие nativeDragDrop.

Вы правильно звоните NativeDragManager.acceptDrop()? 1023 *

...