DDrop – Drag n’ Drop для ActionScript 2 (Flash Player 7 и выше)

Класс 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 :D 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.
Пример:

  1. import aw.template.MimeType;
  2. import aw.template.element.DDrop;
  3. import aw.template.element.ddrop.DDropInfo;
  4. function draw(mc:MovieClip, color:Number):Void{
  5. mc.beginFill(color, 100);
  6. mc.lineStyle(1, 0x000000, 0);
  7. mc.moveTo(0, 0);
  8. mc.lineTo(100, 0);
  9. mc.lineTo(100, 100);
  10. mc.lineTo(0, 100);
  11. mc.lineTo(0, 0);
  12. mc.endFill();
  13. mc.createTextField('txt', 1, 0, 0, 100, 20);
  14. var mcTxt:TextField = mc.txt;
  15. mcTxt.autoSize = 'center';
  16. mcTxt.selectable = false;
  17. var tf:TextFormat = new TextFormat();
  18. tf.align = 'center';
  19. tf.color = 0xff0000;
  20. tf.font = 'Verdana';
  21. tf.size = 18;
  22. mcTxt.setNewTextFormat(tf);
  23. mcTxt._y = 35;
  24. mcTxt.text = String(Math.ceil(Math.random()*1000));
  25. }
  26. // ---------------- Создаём символ индикатора (курсор)
  27. this.createEmptyMovieClip('icon', this.getNextHighestDepth());
  28. icon.createTextField('txt', 1, 6, 3, 10, 10);
  29. icon.beginFill(0xff0000, 100);
  30. icon.lineStyle(1, 0x000000, 100);
  31. icon.moveTo(0, 0);
  32. icon.lineTo(10, 20);
  33. icon.lineTo(20, 10);
  34. icon.lineTo(0, 0);
  35. icon.endFill();
  36. var iconTxt:TextField = icon.txt;
  37. iconTxt.textColor = 0xffffff;
  38. iconTxt.autoSize = 'left';
  39. iconTxt.text = '+';
  40. // устанавливаем события
  41. icon.onMouseDown = function():Void{
  42. DDrop.swapDepths();
  43. }
  44. icon.onDrag = function(info:DDropInfo):Void{
  45. trace('onDrag '+info);
  46. icon._visible = true;
  47. Mouse.hide();
  48. }
  49. icon.onDrop = function(correct:Boolean, info:DDropInfo):Void{
  50. trace('onDrop '+correct+' '+info);
  51. icon._visible = false;
  52. Mouse.show();
  53. }
  54. DDrop.addListener(icon, [DDrop.DRAG_EVENT, DDrop.DROP_EVENT]);
  55. // предустановка
  56. icon.onDrop(null);
  57. // ---------------- Создаём источник даных
  58. this.createEmptyMovieClip('source', this.getNextHighestDepth());
  59. this.source._x = 100;
  60. this.source._y = 100;
  61. draw(this.source, 0x004400);
  62. // задаём MIME type
  63. this.source.mimeType = new MimeType('item/view-source');
  64. // задаём функциональность источника данных
  65. this.source.DDropDrag = function():String{
  66. return this.txt.text;
  67. }
  68. // задаём метод результата
  69. this.source.DDropReturn = function(target:MovieClip, info:DDropInfo):Void{
  70. this.txt.text = info.result;
  71. }
  72. // ---------------- Создаём приемник данных
  73. this.createEmptyMovieClip('target', this.getNextHighestDepth());
  74. this.target._x = 300;
  75. this.target._y = 100;
  76. draw(this.target, 0x000044);
  77. // задаём MIME type
  78. this.target.mimeType = new MimeType('item/view-target');
  79. // задаём функциональность приемника данных
  80. this.target.DDropDrop = function(info:DDropInfo):String{
  81. this.txt.text = info.data;
  82. return String(Math.ceil(Math.random()*1000));
  83. }
  84. // ---------------- Настраиваем DDrop
  85. // применяем индикатор к DDrop
  86. DDrop.iconLibrary = icon;
  87. // задаём порог чувствительности для второстепенного признака MIME type т.к. начальный уровень "0" требует полной идентичноти MIME type.
  88. DDrop.mimeSecondaryLimit = 1;
  89.  

Как видите, DDrop не требует регистрации объектов способных участвовать в Drag n’ Drop. Необходимо только задать MIME type символа и метод отвечающий функциям данного объекта.

Скачать пакет DDrop.

Добавить комментарий

Вы должны авторизоваться для отправки комментария.