Для поддержки жеста перетаскивания необходимо создать объект Clipboard в ответ на событие
mouseDown
и отправить его методу
NativeDragManager.doDrag()
. Затем приложение может прослушивать событие
nativeDragComplete
на объекте-инициаторе, чтобы определить, какое действие необходимо выполнить, когда пользователь завершит или остановит действие.
Подготовка данных для передачи
Чтобы подготовить данные к перетаскиванию, создайте объект Clipboard и добавьте информацию, которую необходимо передать в одном или нескольких форматах. Для передачи данных можно использовать стандартные форматы, которые автоматически переводятся в исходные форматы буфера обмена, или форматы, заданные приложениями для передачи объектов.
Если перевод в определенный формат требует слишком много вычислительной мощности, то для выполнения преобразования можно передать имя функции обработчика. Функция вызывается только в том случае, если компонент или приложение-получатель распознают связанный формат.
Дополнительные сведения о форматах буфера обмена см. в разделе «
Форматы данных Clipboard
».
В примере ниже показано, как создавать объект Clipboard, содержащий растровое изображение в нескольких форматах: объект Bitmap, исходный формат растрового изображения и формат списка файлов, содержащего файл, из которого изображение изначально загружается:
import flash.desktop.Clipboard;
import flash.display.Bitmap;
import flash.filesystem.File;
public function createClipboard(image:Bitmap, sourceFile:File):Clipboard{
var transfer:Clipboard = new Clipboard();
transfer.setData("CUSTOM_BITMAP", image, true); //Flash object by value and by reference
transfer.setData(ClipboardFormats.BITMAP_FORMAT, image.bitmapData, false);
transfer.setData(ClipboardFormats.FILE_LIST_FORMAT, new Array(sourceFile), false);
return transfer;
}
Начало операции «перетаскивания из»
Для начала операции перетаскивания нужно вызвать метод
NativeDragManager.doDrag()
в ответ на нажатие кнопки мыши. Метод
doDrag()
является статическим и принимает ряд параметров:
Параметр
|
Описание
|
initiator
|
Объект-инициатор перетаскивания, отправляющий события
dragStart
и
dragComplete
. Инициатором всегда является интерактивный объект.
|
clipboard
|
Объект Clipboard, содержащий передаваемые данные. На объект Clipboard ссылается объект NativeDragEvent, отправляемый в ходе последовательности захвата и перетаскивания.
|
dragImage
|
Объект BitmapData, отображаемый во время перетаскивания (не обязательно). Для изображения может быть задано значение
alpha
. (Примечание. Microsoft Windows всегда применяет к перетаскиваемым изображениям предопределенное обесцвечивание альфа-канала.)
|
offset
|
Объект Point, задающий смещение изображения перетаскивания относительно указателя мыши (не обязательно). При отрицательных координатах изображение будет смещено вверх и влево относительно курсора. Если значение смещения не задано, то левый угол изображения перетаскивания располагается у кончика указателя мыши.
|
actionsAllowed
|
Объект NativeDragOptions, указывающий, какие действия (копирование, перемещение или создание ссылки) действительны для операции перетаскивания (не обязательно). Если ни один аргумент не передается, то разрешены все действия. На объект DragOptions ссылаются объекты NativeDragEvent, позволяющие проверить, совместима ли потенциальная цель перетаскивания с выполняемыми действиями. Например, компонент trash может принимать только перетаскивания типа «перемещение».
|
В примере ниже показано, как начинать операцию перетаскивания для растрового изображения, загруженного из файла. В примере изображение загружается, а по событию
mouseDown
начинается его перетаскивание.
package
{
import flash.desktop.NativeDragManager;
import mx.core.UIComponent;
import flash.display.Sprite;
import flash.display.Loader;
import flash.system.LoaderContext;
import flash.net.URLRequest;
import flash.geom.Point;
import flash.desktop.Clipboard;
import flash.display.Bitmap;
import flash.filesystem.File;
import flash.events.Event;
import flash.events.MouseEvent;
public class DragOutExample extends UIComponent Sprite {
protected var fileURL:String = "app:/image.jpg";
protected var display:Bitmap;
private function init():void {
loadImage();
}
private function onMouseDown(event:MouseEvent):void {
var bitmapFile:File = new File(fileURL);
var transferObject:Clipboard = createClipboard(display, bitmapFile);
NativeDragManager.doDrag(this,
transferObject,
display.bitmapData,
new Point(-mouseX,-mouseY));
}
public function createClipboard(image:Bitmap, sourceFile:File):Clipboard {
var transfer:Clipboard = new Clipboard();
transfer.setData("bitmap",
image,
true);
// ActionScript 3 Bitmap object by value and by reference
transfer.setData(ClipboardFormats.BITMAP_FORMAT,
image.bitmapData,
false);
// Standard BitmapData format
transfer.setData(ClipboardFormats.FILE_LIST_FORMAT,
new Array(sourceFile),
false);
// Standard file list format
return transfer;
}
private function loadImage():void {
var url:URLRequest = new URLRequest(fileURL);
var loader:Loader = new Loader();
loader.load(url,new LoaderContext());
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
}
private function onLoadComplete(event:Event):void {
display = event.target.loader.content;
var flexWrapper:UIComponent = new UIComponent();
flexWrapper.addChild(event.target.loader.content);
addChild(flexWrapper);
flexWrapper.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}
}
}
Завершение «перетаскивания из»
Когда пользователь отпускает перетаскиваемый объект, отпуская кнопку мыши, объект-инициатор отправляет событие
nativeDragComplete
. Можно проверить свойство
dropAction
объекта события, а затем выполнить нужное действие. Например, при действии
NativeDragAction.MOVE
исходный элемент может быть удален из своего начального местоположения. Пользователь может прекратить перетаскивание, отпустив кнопку мыши за пределами целевой области. Диспетчер перетаскивания задает свойству
dropAction
действия прекращения значение
NativeDragAction.NONE
.
|
|
|