Класс aw.template.element.DDrop осуществляет контроль над перетаскиванием данных между символами сцены. Отбор символов и их «совместимость» определяется по MIME type символа с помощью класса aw.template.MimeType (узнать подробнее) – у каждого «перетаскиваемого» символа должно быть свойство содержащее своё значение типа MimeType. Так же класс DDrop требует наличия методов в символе:
- DDropDrag – для источника данных: получения данных о перетаскиваемом символе
- DDropDrop – для приемника данных: осуществления приёма опущенных символов
Опционально:
- DDropReturn – для источника данных: метод получения информации о результате операции
- DDropDragable - для источника данных: свойство информирующее о возможности перетаскивания
На самом деле он не перетаскивает символы на сцене, он отображает перенос данных полученых из метода DDropDrag из символа источника в метод DDropDrop символа приёмника (можно воспользоватся BitmapData, появившемся во Flash Player 8). Когда пользователь нажимает мышку, то запускается механизм:
- сбор информации о всех символах сцены, которые находились под указателем мышки в момент нажатия и содержат в себе свойство mimeType. Самый первый (глубокий) символ с mimeType принимается как источник данных.
- Проверка на наличие свойства или метода DDropDragable и если таковой есть, то проверяет значение свойства или возвращаемое значение метода и если оно равно false, то операция обрывается. Если метод или свойство DDropDragable не найдено или возвращает true, то считается, что символ перетаскиваемый.
- Проверяет присутствие метода DDropDrag у символа источника и собирает информацию о нём в объект типа aw.template.element.ddrop.DDropInfo:
- instance – ссылка на символ источник
- mimeType – MIME type перетаскиваемого символа
- data – данные полученные из метода DDropDrag
- Сохраняет полученные данные в свойстве DDRop.dropData.
- Рассылается событие onStartDrag c параметрами:
- ссылка на сохранённый объект DDropInfo.
События рассылаются с помощью механизма Broadcaster'а. К объекту, содержащему информацию о перетаскиваемом символе можно получить доступ через свойство DDrop.dropData.
После получения необходимых данных о символе источнике DDrop ждёт перетаскивания. Когда пользователь перетащит мышку на указанное в свойстве DDrop.detectionLimit число пикселей по вертикали или горизонтали, то включится процесс перетаскивания. Произойдёт повторная проверка на свойство/метод DDropDragable и если проверка даст положительный результат, то произойдёт следующее:
- отобразится указанный индикатор (как установить индикатор описывается ниже). Автоматическое повышение глубины не срабатывает автоматически, но его можно запустить с помощью метода DDrop.swapDepths().
- будет разослано событие onDrag с параметрами:
- ссылка на сохранённый объект DDropInfo.
Если же повторная проверка покажет, что символ источник не для перетаскивания, то сработает событие onDragError.
Перед опусканием символа и вызовом метода DDropDrop собирается информация обо всех символах находящихся под указателем мышки в момент опускания. Каждый из них проверяется на наличие необходимого MIME type и метода DDropDrop. Первый символ, тип которого совпадает с типом перетаскиваемого символа, будет использован как символ приёмник. Если такой находится, то запустится механизм:
- Скрывается со сцены индикатор переноса.
- В сохранённый объект DDropInfo добавляется информация:
- dropPath – путь к символу приёмнику.
- dropInstance – ссылка на символ приёмник.
- result – значение возвращаемое методом DDropDrop вызванным в объекте приемнике. Этот параметр получает значение только после следующего шага!
- Вызывается метод DDropDrop у символа, в который передаётся сохранённый объект DDropInfo.
- Рассылается событие onDrop с параметрами.
- true/false – был ли обнаружен символ с нужным mimeType.
- ссылка на сохранённый объект DDropInfo.
- Проверяет наличие метода DDropReturn у символа источника и если такой обнаруживается, то вызывается с параметрами:
- ссылка на символ приемник, в который перетащили данный символ.
- ссылка на сохранённый объект DDropInfo.
После переноса, не зависимо от результата операции, все данные о переносе отчищаются.
Свойства доступные в классе DDrop:
Read/Write
- iconLibrary:Object – указывает символ на сцене используемый как индикатор. Можно задать имя символа в библиотеке, тогда будет вызван метод setIconLibrary со значением _root в качестве родительского символа для индикатора
- detectionLimit:Number – количество пикселей, на которые должен перенести пользователь мышку ,чтоб включился индикатор и начался перенос данных.
- iconPaddingX:Number – отступ для индикатора, задаётся относительно указателя мышки. Доступен только для индикатора добавляемого из библиотеки.
- iconPaddingY:Number – отступ для индикатора, задаётся относительно указателя мышки. Доступен только для индикатора добавляемого из библиотеки.
- mimeSecondaryLimit:Number – порог чувствительности для второстепенного признака объекта MimeType, используемый при сравнении типа источника и типа приёмника.
- dragMethod:String – имя метода символа источника используемого для получения информации. Значение по умолчанию «DDropDrag».
- dropMethod:String – имя метода символа приёмника используемого для применения информации. Значение по умолчанию «DDropDrop».
- resultMethod:String – имя метода символа источника используемого для получения информации о проведённой операции. Значение по умолчанию «DDropReturn».
- typeContainer:String – имя свойства используемого для хранения MimeType. Значение по умолчанию «mimeType».
- dragApplyer:String – имя метода/свойства символа источника используемого для указания возможности перетаскивания данных из источника. Значение по умолчанию «DDropDragable».
Read-only
- dropData
DropInfo – объект DDropInfo содержащий данные о текущей операции - mimeType:MimeType – MIME type источника данных используемого в данный момент
- DROP_EVENT:String – тип события «onDrop»
- DRAG_EVENT:String – тип события «onDrag»
- START_DRAG_EVENT:String – тип события «onStartDrag»
- ERROR_EVENT:String – тип события « onDragError»
Устанавливаем индикатор переноса.
По умолчанию класс DDrop не имеет ссылки, на какой либо индикатор, его нужно установить с помощью метода DDrop.setIconLibrary(). Метод принимает следующие параметры:
- name:String – Имя библиотечного символа, который будет отвечать за индикацию процесса.
- parent:MovieClip – Родительский символ сцены в который будет установлен индикатор. По умолчанию, _root.
Если до этого уже был присвоен индикатор, то он будет удалён со сцены.
Кроме этого метода есть возможность задать в качестве индикатора уже находящийся на сцене объект. Это можно сделать, указав символ параметру DDrop.iconLibrary.
Перемещение индикатора регулируется стандартными методами MovieClip.startDrag()/stopDrag(), поэтому индикатор всегда будет под мышкой. Иногда это не желательно и нужно слегка сдвинуть индикатор(или графику внутри символа) от центра символа.
Пользуясь событиями DDrop можно добавить индикатору эффекты типа затухания или смену графики в зависимости от MIME type.
Пример:
import aw.template.MimeType; import aw.template.element.DDrop; import aw.template.element.ddrop.DDropInfo; function draw(mc:MovieClip, color:Number):Void{ mc.beginFill(color, 100); mc.lineStyle(1, 0x000000, 0); mc.moveTo(0, 0); mc.lineTo(100, 0); mc.lineTo(100, 100); mc.lineTo(0, 100); mc.lineTo(0, 0); mc.endFill(); mc.createTextField('txt', 1, 0, 0, 100, 20); var mcTxt:TextField = mc.txt; mcTxt.autoSize = 'center'; mcTxt.selectable = false; var tf:TextFormat = new TextFormat(); tf.align = 'center'; tf.color = 0xff0000; tf.font = 'Verdana'; tf.size = 18; mcTxt.setNewTextFormat(tf); mcTxt._y = 35; mcTxt.text = String(Math.ceil(Math.random()*1000)); } // ---------------- Создаём символ индикатора (курсор) this.createEmptyMovieClip('icon', this.getNextHighestDepth()); icon.createTextField('txt', 1, 6, 3, 10, 10); icon.beginFill(0xff0000, 100); icon.lineStyle(1, 0x000000, 100); icon.moveTo(0, 0); icon.lineTo(10, 20); icon.lineTo(20, 10); icon.lineTo(0, 0); icon.endFill(); var iconTxt:TextField = icon.txt; iconTxt.textColor = 0xffffff; iconTxt.autoSize = 'left'; iconTxt.text = '+'; // устанавливаем события icon.onMouseDown = function():Void{ DDrop.swapDepths(); } icon.onDrag = function(info:DDropInfo):Void{ trace('onDrag '+info); icon._visible = true; Mouse.hide(); } icon.onDrop = function(correct:Boolean, info:DDropInfo):Void{ trace('onDrop '+correct+' '+info); icon._visible = false; Mouse.show(); } DDrop.addListener(icon, [DDrop.DRAG_EVENT, DDrop.DROP_EVENT]); // предустановка icon.onDrop(null); // ---------------- Создаём источник даных this.createEmptyMovieClip('source', this.getNextHighestDepth()); this.source._x = 100; this.source._y = 100; draw(this.source, 0x004400); // задаём MIME type this.source.mimeType = new MimeType('item/view-source'); // задаём функциональность источника данных this.source.DDropDrag = function():String{ return this.txt.text; } // задаём метод результата this.source.DDropReturn = function(target:MovieClip, info:DDropInfo):Void{ this.txt.text = info.result; } // ---------------- Создаём приемник данных this.createEmptyMovieClip('target', this.getNextHighestDepth()); this.target._x = 300; this.target._y = 100; draw(this.target, 0x000044); // задаём MIME type this.target.mimeType = new MimeType('item/view-target'); // задаём функциональность приемника данных this.target.DDropDrop = function(info:DDropInfo):String{ this.txt.text = info.data; return String(Math.ceil(Math.random()*1000)); } // ---------------- Настраиваем DDrop // применяем индикатор к DDrop DDrop.iconLibrary = icon; // задаём порог чувствительности для второстепенного признака MIME type т.к. начальный уровень "0" требует полной идентичноти MIME type. DDrop.mimeSecondaryLimit = 1;
Как видите, DDrop не требует регистрации объектов способных участвовать в Drag n’ Drop. Необходимо только задать MIME type символа и метод отвечающий функциям данного объекта.