Поддержка жеста «перетаскивания в» возможна, если приложение (или, что более распространено, визуальный компонент приложения) отвечает на события
nativeDragEnter
или
nativeDragOver
.
Этапы типичной операции отпускания
Для операции отпускания характерна определенная последовательность событий:
-
Пользователь перетаскивает объект буфера обмена на компонент.
-
Компонент отправляет событие
nativeDragEnter
.
-
Обработчик события
nativeDragEnter
исследует объект события на предмет доступных форматов данных и разрешенных действий. Если компонент может обработать отпускание, он вызывает метод
NativeDragManager.acceptDragDrop()
.
-
NativeDragManager изменяет вид курсора мыши, чтобы показать, что объект можно отпустить.
-
Пользователь отпускает объект на компоненте.
-
Компонент-получатель отправляет событие
nativeDragDrop
.
-
Компонент-получатель считывает из объекта Clipboard в объекте события данные в нужном формате.
-
Если жест перетаскивания начался в приложении AIR, то интерактивный объект-инициатор отправляет событие
nativeDragComplete
. Если жест начался вне приложения AIR, обратной связи нет.
Распознавание жеста «перетаскивания в»
Когда пользователь перетаскивает элемент буфера обмена в границы визуального компонента, тот отправляет события
nativeDragEnter
и
nativeDragOver
. Чтобы определить, может ли компонент принять этот элемент, обработчики этих событий проверяют свойства
clipboard
и
allowedActions
объекта события. Для подтверждения возможности перетаскивания обработчик события должен вызвать метод
NativeDragManager.acceptDragDrop()
и передать компоненту-получателю ссылку. Если метод
acceptDragDrop()
вызывается сразу несколькими обработчиками, то преимущество имеет последний в списке. Вызов метода
acceptDragDrop()
остается действительным, пока курсор мыши не будет выведен за границы объекта-получателя и не будет отправлено событие
nativeDragExit
.
Если параметром
allowedActions
, передаваемым методу
doDrag()
, разрешено более одного действия, пользователь может указать желаемое действие с помощью клавиши-модификатора. Диспетчер перетаскивания изменяет изображение курсора, показывая пользователю, какое действие будет совершено при отпускании. О планируемом действии сообщает свойство
dropAction
объекта NativeDragEvent. Действие, заданное для жеста перетаскивания, приводится исключительно для информации. Поведение компонентов, задействованных в передаче, должно быть соответствующим. Для завершения, например, действия перемещения инициатор перетаскивания может удалять перетаскиваемый объект, а целевой элемент — добавлять его.
Цель перетаскивания может ограничивать число действий отпускания до трех возможных с помощью свойства
dropAction
класса NativeDragManager. Если пользователь пытается выбрать другое действие с помощью клавиатуры, NativeDragManager отобразит курсор вида
unavailable
. В обработчиках событий
nativeDragEnter
и
nativeDragOver
следует задать свойство
dropAction
.
В примере ниже рассматривается обработчик событий
nativeDragEnter
и
nativeDragOver
. Этот обработчик принимает жест «перетаскивания в», только если перетаскиваемый объект буфера обмена содержит данные в текстовом формате.
import flash.desktop.NativeDragManager;
import flash.events.NativeDragEvent;
public function onDragIn(event:NativeDragEvent):void{
NativeDragManager.dropAction = NativeDragActions.MOVE;
if(event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){
NativeDragManager.acceptDragDrop(this); //'this' is the receiving component
}
}
Завершение перетаскивания
Когда пользователь отпускает перетаскиваемый элемент на интерактивном объекте, принимающем этот жест, тот отправляет событие
nativeDragDrop
. Обработчик этого события может извлекать данные из свойства
clipboard
объекта события.
Когда в буфере обмена содержится поддерживаемый приложением формат, параметр
transferMode
, передаваемый методу
getData()
объекта Clipboard, определяет, что должен возвращать диспетчер перетаскивания: ссылку или сериализованную версию объекта.
В примере ниже рассматривается обработчик события
nativeDragDrop
:
import flash.desktop.Clipboard;
import flash.events.NativeDragEvent;
public function onDrop(event:NativeDragEvent):void {
if (event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
var text:String =
String(event.clipboard.getData(ClipboardFormats.TEXT_FORMAT,
ClipboardTransferMode.ORIGINAL_PREFERRED));
}
При появлении обработчика события объект Clipboard перестает действовать. Любая попытка доступа к этому объекту или его данным возвращает ошибку.
Обновление внешнего вида компонента
Внешний вид компонента может обновляться на основании событий NativeDragEvent. В таблице ниже показаны типы изменений, которые могут происходить с типичным компонентом в ответ на различные события.
Событие
|
Описание
|
nativeDragStart
|
Интерактивный объект-инициатор может использовать событие
nativeDragStart
для обозначения того, что интерактивный объект инициировал перетаскивание.
|
nativeDragUpdate
|
Интерактивный объект-инициатор может использовать событие nativeDragUpdate для обновления своего состояния во время этого жеста. (Это событие не существует в AIR for Linux.)
|
nativeDragEnter
|
Потенциальный интерактивный объект-получатель может использовать это событие для принятия фокуса или визуального обозначения того, что перетащить на него данные нельзя.
|
nativeDragOver
|
Потенциальный интерактивный объект-получатель может использовать это событие для ответа на движение мыши в границах интерактивного объекта, например когда курсор мыши входит в границы «горячей» области сложного компонента, такого как карта города.
|
nativeDragExit
|
Потенциальный интерактивный объект-получатель может использовать это событие для обозначения того, что курсор, перетаскивающий данные, покидает его границы.
|
nativeDragComplete
|
Потенциальный интерактивный объект-получатель может использовать это событие для обновления связанной с ним модели данных (например, путем удаления элемента из списка) и для восстановления своего визуального состояния.
|
Отслеживание положения мыши во время жеста «перетаскивания в»
Пока жест перетаскивания выполняется в границах компонента, отправляются события
nativeDragOver
. Эти события отправляются каждые несколько миллисекунд и при любом движении мыши. Объект события
nativeDragOver
может использоваться для определения положения мыши в границах компонентом. Доступ к положению мыши полезен в тех ситуациях, когда компонент-получатель является сложным, но при этом не состоит из нескольких компонентов. Например, если в приложении отображается растровое изображение карты города и на нем при перетаскивании информации требуется выделить некоторые области, то данные о координатах мыши можно получить с помощью события
nativeDragOver
, позволяющего отслеживать положение мыши на карте.
|
|
|