Flex拖放到拖动代理的精确坐标

时间:2011-02-24 06:18:55

标签: drag-and-drop flex4 coordinates

我在flex(web)应用程序中添加了自定义拖放功能,除了一个小小的问题外,一切正常。丢弃的图像略微偏离实际的拖动代理。我希望拖放的图像位于拖动代理的确切位置。我从VBox拖到Panel。我似乎无法在实际代理坐标和丢弃的坐标之间建立连接。 Thanx很多:)

1 个答案:

答案 0 :(得分:2)

这是一个老问题,但我相信其他人正在寻找这些信息。经过大量的调试后,我确定了一种方法来完成这项工作(Flex 4 ... 3可能类似)。 问题是用户可以在任何地方抓取原始对象以开始拖动。放下对象时,需要指定它的位置。要完美地删除它,您需要知道用户抓住对象的位置。我无法找到任何对“鼠标对象”的引用,并且DragEvent中的coords被传递到Drop Event处理程序。但是,此信息是在Mouse Down处理程序中传递的原始MouseEvent(localX,localY)中提供的。你需要做的就是坚持这些坐标(我将它们存储在被拖动的对象中作为鼠标偏移变量)。当drop事件发生时,只需从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);
}

希望能节省一些时间......