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