Поддержка жеста «перетаскивания в»

Adobe AIR 1.0 и более поздних версий

Поддержка жеста «перетаскивания в» возможна, если приложение (или, что более распространено, визуальный компонент приложения) отвечает на события nativeDragEnter или nativeDragOver .

Этапы типичной операции отпускания

Для операции отпускания характерна определенная последовательность событий:

  1. Пользователь перетаскивает объект буфера обмена на компонент.

  2. Компонент отправляет событие nativeDragEnter .

  3. Обработчик события nativeDragEnter исследует объект события на предмет доступных форматов данных и разрешенных действий. Если компонент может обработать отпускание, он вызывает метод NativeDragManager.acceptDragDrop() .

  4. NativeDragManager изменяет вид курсора мыши, чтобы показать, что объект можно отпустить.

  5. Пользователь отпускает объект на компоненте.

  6. Компонент-получатель отправляет событие nativeDragDrop .

  7. Компонент-получатель считывает из объекта Clipboard в объекте события данные в нужном формате.

  8. Если жест перетаскивания начался в приложении 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 , позволяющего отслеживать положение мыши на карте.