PDA

Просмотр полной версии : Drag-and-Drop - узнать куда перемещается


easyLife
22.03.2007, 16:51
Есть объект First:UIComponent, он находится в Panel1 - его ребенок.
Есть Panel2 - сюда необходимо перетащить объект UIComponent.
Создание объекта происходит с помощью AS.
Когда я перетаскиваю (1. startDrag(). 2.stopDrag()) , то фактически мой объект остается в том же Panel1, где он дочерний элемент, а визуально его можно до операции stopDrag() перенести в любую область экрана, только после stopDrag() он свои новые координаты отсчитывает в своем родительском элементе Panel1.
Хочу, чтобы при перетаскивании на Panel2, он добавлялся в Panel2 на указанное место.

Т.е. могу ли я определить в момент stopDrag над каким каким контейнером находится мой объект? Или можно сделать как-то иначе?

etc
22.03.2007, 17:10
Копай в сторону DragEvent.currentTarget
http://livedocs.macromedia.com/flex/201/html/dragdrop_081_13.html

easyLife
22.03.2007, 17:23
Спасибо большое!!!!

easyLife
22.03.2007, 20:43
После DragManager.doDrag(dragInitiator, ds, event, dragInitiator); , объект, который перетаскивается (UIComponent) из Panel1 в Panel2 перестает быть дочерним в Panel1, но при попытке добавить его в Panel2 ( Panel2.addChild(First) ) выдает ошибку:
RangeError: Error #2006: The supplied index is out of bounds.

etc
22.03.2007, 21:45
Давай ты соберешь нерабочий пример, а то мне собирать очередной проект не очень хочется :)

easyLife
23.03.2007, 19:28
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script><![CDATA[
import flash.geom.*;
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.errors.*;
import mx.managers.*;
import mx.core.DragSource;
import mx.events.*;
import mx.controls.Image;
import mx.graphics.*;
import mx.core.*;
//part for graphics =)))
import mx.containers.Panel;

var uic:UIComponent = new UIComponent();

public function init() {
img_panel.addEventListener(DragEvent.DRAG_ENTER, makeDragEnter);
img_panel.addEventListener(DragEvent.DRAG_DROP, makeDragDrop);

var myCont:Sprite = new Sprite();
var Rect:Shape = new Shape();

Rect.graphics.lineStyle(1, 0x000000);
Rect.graphics.beginFill(0x00FF00, 1);
Rect.graphics.drawRect(0, 0, 120, 120);
myCont.addChild(Rect);

tools_panel.addChild(uic);
uic.addChild(myCont);

uic.addEventListener(MouseEvent.MOUSE_MOVE, dragMeObj);
}

public function dragMeObj(event:MouseEvent):void {
var dragInitiator:UIComponent =UIComponent(event.currentTarget);
var ds:DragSource = new DragSource();
DragManager.doDrag(dragInitiator, ds, event, dragInitiator);
//dragInitiator.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
//dragInitiator.startDrag();
}

public function makeDragDrop(event:DragEvent):void {
img_panel.addChild(uic);
}

public function makeDragEnter(event:DragEvent):void {
var dropTarget:UIComponent = UIComponent(event.target);
DragManager.acceptDragDrop(dropTarget);
}


]]></mx:Script>

<mx:Panel x="0" y="10" width="423" height="467" layout="absolute" id="img_panel">
</mx:Panel>
<mx:Panel x="431" y="10" width="228" height="467" layout="absolute" id="tools_panel">
</mx:Panel>

</mx:Application>

Ошибка возникает только в том случае, когда в
DragManager.doDrag(dragInitiator, ds, event, dragInitiator);
в качестве объекта замещения передаю dragInitiator.
Если не передаю: DragManager.doDrag(dragInitiator, ds, event); , то всё хорошо

etc
24.03.2007, 14:07
easyLife, а простыню кода твоего оформлять кто будет?

Приведи код в порядок. Я покулыпаюсь и напишу.

easyLife
25.03.2007, 23:40
Быть может я неправильно поняла что значит оформлять, но одной мне это точно не победить. Хочу, чтобы во время перетаскивания объект перетаскивания был под курсором мыши и хочется, чтобы ошибки не было. Читаю доку, найти не могу в чем причина :(

asuri
26.03.2007, 00:40
Посмотри. Это случайно не то, что тебе надо??
http://www.rictus.com/flex/LiveReflection/srcview/index.html

etc
26.03.2007, 17:52
Какой-то жесткий хак:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script><![CDATA[
import flash.geom.*;
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.errors.*;
import mx.managers.*;
import mx.core.DragSource;
import mx.events.*;
import mx.controls.Image;
import mx.graphics.*;
import mx.core.*;
//part for graphics =)))
import mx.containers.Panel;

private var uic:UIComponent = new UIComponent();

public function init():void {
img_panel.addEventListener(DragEvent.DRAG_ENTER, makeDragEnter);

var myCont:Sprite = new Sprite();
var Rect:Shape = new Shape();

Rect.graphics.lineStyle(1, 0x000000);
Rect.graphics.beginFill(0x00FF00, 1);
Rect.graphics.drawRect(0, 0, 120, 120);
myCont.addChild(Rect);

tools_panel.addChild(uic);
uic.addChild(myCont);

uic.addEventListener(MouseEvent.MOUSE_MOVE, dragMeObj);
}

public function dragMeObj(event:MouseEvent):void {
var dragInitiator:UIComponent = UIComponent(event.currentTarget);
var ds:DragSource = new DragSource();
DragManager.doDrag(dragInitiator, ds, event, dragInitiator);
dragInitiator.addEventListener(DragEvent.DRAG_COMPLETE,makeDragDrop);
//dragInitiator.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
//dragInitiator.startDrag();
}

public function makeDragDrop(event:DragEvent):void {
//
uic.addEventListener(Event.REMOVED,removedHandler);
}

private function removedHandler(event:Event):void {
//img_panel.addChild(uic);
callLater(completeHandler);
}

private function completeHandler():void {
img_panel.addChild(uic);
}

public function makeDragEnter(event:DragEvent):void {
var dropTarget:UIComponent = UIComponent(event.target);
DragManager.acceptDragDrop(dropTarget);
}


]]></mx:Script>

<mx:Panel x="0" y="10" width="423" height="467" layout="absolute" id="img_panel">
</mx:Panel>
<mx:Panel x="431" y="10" width="228" height="467" layout="absolute" id="tools_panel">
</mx:Panel>

</mx:Application>
Я так выяснил, что DragManager не позволяет именно перемещать объекты. Потому как на endDrag у DragManagerImpl подписаться никак невозможно. А ошибка выскакивала из-за того, что в момент отпускания мыши запускался new Move(), в конце которого DragProxy вызывает endDrag, в которой происходит removeChild, которого уже нет.

easyLife
26.03.2007, 19:53
Спасибо за объяснение причины ошибки. Буду думать.
а жесткий хак помогает только до следующей попытки перетащить - после первого перетаскивания

etc
26.03.2007, 20:19
Ну это пофиксить предлагается самостоятельно.

ir73
27.03.2007, 12:34
а если ошибку за трай кетчить? и кетч игнорировать?

etc
27.03.2007, 12:36
Можно, но анимации «падения» ролика в панель не будет. Да и неправильно это, надо дождаться момента, когда DragProxy снесет из себя перемещаемый мувик. А подписаться на это событие невозможно, судя по коду. Поэтому приходится проверять момент удаления ролика и в отложенном действии повесить ролик на панель.
Да, а что отлавливать-то конкретно? try { addChild } ?