2

我希望能够区分影片剪辑是被拖动还是单击,并相应地执行不同的功能。问题是startDrag由MOUSE_DOWN发起,stopDrag由MOUSE_UP发起,每次都会触发CLICK事件。我想要做的是,在点击事件的条件下,说类似“如果拖动==真{做某事}”

我想我可以在 mouse_up 或 mouse_down 函数中设置一个标志,但问题是 mouse_down 与鼠标单击同时发生。我需要能够在实际的 stopDrag() 函数或其他东西中设置标志。我已经看到了一个涉及设置超时的解决方案——我想避免这种情况。有任何想法吗?

4

3 回答 3

5

我不得不处理很多次的事情。

我所做的是在捕获阶段创建一个额外的 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);
}
于 2012-08-16T19:53:17.070 回答
1

比较拖动开始时的 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 不完全相等但相差几个像素(因为点击并不总是完美的上下像素),但上面的代码应该为大部分。

于 2012-08-16T19:53:53.247 回答
0

您可以使用dispatchEvent创建自己的自定义侦听器。

像这样使用它:

dispatchEvent(new Event("customEvent"));

您可以将其称为正常事件:

addEventListener("customEvent", eventFunction);
于 2012-08-16T19:51:12.800 回答