Поддержка жеста «перетаскивания в»Adobe AIR 1.0 и более новых версий
Поддержка жеста «перетаскивания в» возможна, если приложение (или, что более распространено, визуальный компонент приложения) отвечает на события 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 для Linux.)
|
nativeDragEnter
|
Потенциальный интерактивный объект-получатель может использовать это событие для принятия фокуса или визуального обозначения того, что перетащить на него данные нельзя.
|
nativeDragOver
|
Потенциальный интерактивный объект-получатель может использовать это событие для ответа на движение мыши в границах интерактивного объекта, например когда курсор мыши входит в границы «горячей» области сложного компонента, такого как карта города.
|
nativeDragExit
|
Потенциальный интерактивный объект-получатель может использовать это событие для обозначения того, что курсор, перетаскивающий данные, покидает его границы.
|
nativeDragComplete
|
Потенциальный интерактивный объект-получатель может использовать это событие для обновления связанной с ним модели данных (например, путем удаления элемента из списка) и для восстановления своего визуального состояния.
|
Отслеживание положения мыши во время жеста «перетаскивания в»
Пока жест перетаскивания выполняется в границах компонента, отправляются события nativeDragOver. Эти события отправляются каждые несколько миллисекунд и при любом движении мыши. Объект события nativeDragOver может использоваться для определения положения мыши в границах компонентом. Доступ к положению мыши полезен в тех ситуациях, когда компонент-получатель является сложным, но при этом не состоит из нескольких компонентов. Например, если в приложении отображается растровое изображение карты города и на нем при перетаскивании информации требуется выделить некоторые области, то данные о координатах мыши можно получить с помощью события nativeDragOver, позволяющего отслеживать положение мыши на карте.
|
|