CLICK и DOUBLE_CLICK для ActionScript MouseEvent - PullRequest
1 голос
/ 11 апреля 2010

нельзя ли иметь и CLICK, и DOUBLE_CLICK для одного и того же экранного объекта? я пытаюсь использовать оба для этапа, где двойной щелчок по этапу добавляет новый объект, а один щелчок по этапу отменяет выбор выбранного объекта.

похоже, что DOUBLE_CLICK выполнит как сам, так и первые функции CLICK на пути к DOUBLE CLICK (мышь вниз, мышь вверх, щелчок, мышь вниз, мышь вверх, двойной щелчок).

на других языках, которые я запрограммировал, были встроенные таймеры, которые разделили их. это не доступно в AS3?


UPDATE

вот код. по сути, я хотел бы иметь один или другой, а не оба с двойным щелчком

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)

Ответы [ 3 ]

8 голосов
/ 11 апреля 2010

Ну, вы можете использовать setTimeout и 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);
5 голосов
/ 11 апреля 2010

Вы установили .doubleClickEnabled в true?

Вы также должны взглянуть здесь .

1 голос
/ 10 января 2014

Отличный ответ Wallacoloo - спасибо за это. Я только что реализовал ваше решение и уточнил несколько моментов, поэтому я подумал, что поместу его здесь для дальнейшего использования (и, конечно, для сообщества переполнения!). Во-первых, я не смог проверить неопределенность в uint, возвращаемом setTimeout, поэтому я заменил неопределенное условие условным == 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);
        }
...