Flex Drag / Drop для точных координат Drag Proxy - PullRequest
1 голос
/ 24 февраля 2011

Я добавил пользовательское перетаскивание в гибкое (веб) приложение, и все это отлично работает, за исключением небольшой проблемы. Отброшенное изображение немного сбрасывает фактический прокси перетаскивания. Я хочу, чтобы изображение перетаскивалось и находилось в том же месте, что и прокси-сервер перетаскивания. Я перетащил из VBox на панель. Я просто не могу установить связь между фактическими координатами прокси и удаленными координатами. Большое спасибо :)

1 Ответ

2 голосов
/ 06 июня 2011

Это старый вопрос, но я уверен, что другие ищут эту информацию. После долгих отладок я определил способ сделать эту работу (Flex 4 ... 3 может быть похожим). Проблема в том, что пользователь может захватить оригинальный объект в любом месте, чтобы начать перетаскивание. Когда вы бросаете объект, вам нужно указать, куда он идет. Чтобы сделать это идеально, вам нужно знать, где пользователь схватил объект. Мне не удалось найти какую-либо ссылку на координаты «объект-мышь» x, y в DragEvent, переданные в обработчик события Drop. Однако эта информация предоставляется в оригинальном MouseEvent (localX, localY), переданном в обработчик Mouse Down. Все, что вам нужно сделать, это сохранить эти координаты (я сохранил их в перетаскиваемом объекте как переменные смещения мыши). Когда происходит событие удаления, просто вычтите их соответственно из DragEvents currentTarget mouseX и mouseY. По какой-то причине мне также нужно было вычесть 1 из обеих координат, чтобы получить идеальное падение. Вот фрагмент кода, который, надо надеяться, сделает его более понятным.

// draggable  object mouse down handler
private function mouseDownHandler(e:MouseEvent):void {
  // MenuObject is one of my custom objects
  var tempMenuObject:MenuObject = e.currentTarget as MenuObject;

  // The MenuObject contains its own custom drag proxy
  var tempProxy:Graphic = tempMenuObject.dragProxy;

  // HERE !!! --- persist the "mouse to object" coords
  tempMenuObject.mouseOffsetX = e.localX;
  tempMenuObject.mouseOffsetY = e.localY;

  DragManager.doDrag(e.currentTarget as IUIComponent, null, e, tempProxy);
}

// droppable containers drop handler
private function dragDropHandler(e:DragEvent):void {

  // HERE !!! --- set the dragged objects x y coords (needed to subtract ONE from both coords to get it perfect)
  e.dragInitiator.x = (e.currentTarget.mouseX - MenuObject(e.dragInitiator).mouseOffsetX) - 1;
  e.dragInitiator.y = (e.currentTarget.mouseY - MenuObject(e.dragInitiator).mouseOffsetY) - 1;

  // add the item to the container
  e.currentTarget.addElement(e.dragInitiator);
}

Надеюсь, это спасет кого-то еще ...

...