1

不能在同一个显示对象上同时拥有 CLICK 和 DOUBLE_CLICK 吗?我试图在双击舞台添加一个新对象并在舞台上单击一次取消选择选定对象的舞台上同时拥有两者。

似乎 DOUBLE_CLICK 将同时执行其自身以及指向 DOUBLE CLICK 的路径中的第一个 CLICK 函数(鼠标向下、鼠标向上、单击、鼠标向下、鼠标向上、双击)。

在我编写的其他语言中,有一个内置的计时器将两者分开。这在 AS3 中不可用吗?


更新

这是一些代码。基本上我想要的是有一个或另一个,而不是双击

stage.doubleClickEnabled = true;
stage.addEventListener(MouseEvent.DOUBLE_CLICK, twoClicks, false, 0, true);
stage.addEventListener(MouseEvent.CLICK, oneClick, false, 0, true);

function oneClick(evt:MouseEvent):void
    {
    trace("One CLICK");
    }

function twoClicks(evt:MouseEvent):void
    {
    trace("Two CLICKS");
    }

//oneClick trace = "One CLICK"
//twoClicks trace = "One CLICK Two CLICKS" (instead of just Two CLICKS)
4

3 回答 3

8

好吧,你可以使用setTimeoutand clearTimeout

它看起来像这样:

const var DOUBLE_CLICK_SPEED:int = 10;
var mouseTimeout;

function handleClick(evt:MouseEvent):void {
    if (mouseTimeout != undefined) {
        twoClicks();
        clearTimeout(mouseTimeout);
        mouseTimeout = undefined;
    } else {
        function handleSingleClick():void {
            oneClick();
            mouseTimeout = undefined;
        }
        mouseTimeout = setTimeout(handleSingleClick, DOUBLE_CLICK_SPEED);
    }
}

function oneClick(evt:MouseEvent):void {
    trace("One CLICK");
}

function twoClicks(evt:MouseEvent):void {
    trace("Two CLICKS");
}
stage.addEventListener(MouseEvent.CLICK, handleClick, false, 0, true);
于 2010-04-11T03:30:13.400 回答
5

你设置.doubleClickEnabled成真的了吗?

你也应该看看这里

于 2010-04-11T02:08:54.850 回答
1

很好的答案 Wallacoloo - 谢谢。我刚刚实施了您的解决方案并改进了几点,所以我想我会把它放在这里以供将来参考(当然还有溢出社区的好处!)。首先,我无法在 setTimeout 返回的 uint 上测试 undefined,因此我将 undefined 条件替换为 == 0 条件。其次,我想立即提交单击的逻辑(只是为了使用户界面更愉快),所以我做了一些改组:

        if (mouseTimeout != 0) {
            // clicked within the timeout, handle as double click

            // rollback single click logic
            rollbackSingleClickHandler(e);
            // commit double click logic
            dblClickHandler(e);

            clearTimeOut(mouseTimeout);
            mouseTimeout = 0;
        } else {
            // first click of a click sequence

            // commit single click logic
            singleClickHandler(e); 

            function clearTime():void {
                mouseTimeout = 0;
            }

            // register a timeout for a potential double click
            mouseTimeout = setTimeout(clearTime, DOUBLE_CLICK_SPEED);
        }
于 2014-01-10T01:01:40.290 回答