我希望能够区分影片剪辑是拖动还是单击,并相应地执行不同的功能。问题是 startDrag 由 MOUSE_DOWN 启动,stopDrag 由 MOUSE_UP 启动,并且每次都会触发 CLICK 事件。我想做的是,在单击事件中的条件中,说"如果拖动 == true { do something }"
我想我可以在mouse_up或mouse_down函数中设置一个标志,但问题是mouse_down与鼠标单击同时发生。我需要能够在实际的 stopDrag() 函数或其他函数中设置标志。我已经看到了一个涉及设置超时的解决方案 - 我想避免这种情况。有什么想法吗?
我不得不处理很多次的事情。
我所做的是在捕获阶段创建一个额外的 CLICK 侦听器(优先级高于您使用的任何其他内容),然后在该处理程序上,如果您知道这是一个拖动,则停止事件的传播 - 然后它不会到达任何其他单击处理程序。
所以在你的情况下,如果你使用的是startDrag(我使用我自己的自定义拖动例程),你可以做这样的事情:
function myFuntionThatStartsTheDrag() {
myDragObject.startDrag();
myDragObject.addEventListener(MouseEvent.CLICK,suppressClick,true,9999,true);
}
function suppressClick(e:MouseEvent):void {
e.stopPropagation();
}
function myFunctionThatStopsTheDrag() {
myDragObject.stopDrag();
myDragObject.removeEventListener(MouseEvent.CLICK,suppressClick,true);
}
比较拖动开始时的 x 和 y 位置与拖动结束时的 x 和 y 位置。如果mouseUp上的x和y位置等于mouseDown上的x和y位置,那么你就知道这是一个点击 - 否则它是一个拖累。一个非常简短的例子:
var mouseDownX:int;
var mouseDownY:int;
var dragging:boolean;
//...
private function onMouseDown(event:MouseEvent):void {
mouseDownX = stage.mouseX;
mouseDownY = stage.mouseY;
//...
}
private function onMouseUp(event:MouseEvent):void {
if(mouseDownX == stage.mouseX && mouseDownY == stage.mouseY) {
dragging = false;
} else {
dragging = true;
}
if(dragging) {
//...
}
}
如果这样做,您可以删除单击侦听器,只需在mouseUp中处理所有内容即可。
您可能需要添加一些容差以将 mouseUp 视为单击,即使 x 和 y 不完全相等但相差几个像素(因为单击并不总是完美的上下像素),但上面的代码应该在大多数情况下。
dispatchEvent
创建自己的自定义侦听器。
像这样使用它:
dispatchEvent(new Event("customEvent"));
您可以像正常事件一样称呼它:
addEventListener("customEvent", eventFunction);