Flash as3 - 用于启动拖动、停止拖动的事件侦听器



我希望能够区分影片剪辑是拖动还是单击,并相应地执行不同的功能。问题是 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);

最新更新