flash as3 - startDrag的事件监听器,stopDrag?

时间:2012-08-16 19:44:55

标签: actionscript-3 flash events drag

我希望能够区分是否拖动或点击了影片剪辑,并相应地执行不同的功能。问题是startMrag由MOUSE_DOWN启动,而MOUSE_UP启动stopDrag,每次都会触发CLICK事件。我想要做的是,在click事件的条件中,说出“if dragging == true {do something}”

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

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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不完全相等但偏差几个像素(因为点击并不总是完美上下到像素)但是上面的代码应该大部分都做了。

答案 2 :(得分:0)

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

像这样使用:

dispatchEvent(new Event("customEvent"));

你可以把它称为正常事件:

addEventListener("customEvent", eventFunction);