AS3: startDrag запускает события mouse_up / mouse_click - PullRequest
1 голос
/ 10 октября 2011

Когда я начал разрабатывать мобильные приложения для iOS / Android с использованием Adobe AIR, я столкнулся со странной проблемой (или функцией).

Если вы создадите Sprite и сделаете его перетаскиваемым с помощью startDrag / stopDrag внутри обработчиков событий MOUSE_DOWN / MOUSE_UP, все работает. Но если вы добавите еще одного слушателя MOUSE_CLICK к тому же объекту, он начнет срабатывать вместе с MOUSE_UP. По логике это нормально. Что мне нужно, так это предотвратить запуск обработчика MOUSE_CLICK, когда пользователь перетаскивает Sprite (startDrag), и он мне нужен для запуска, когда пользователь не перетаскивал Sprite.

Я пытаюсь создать небольшую панель миниатюр, которая перетаскивается, и после нажатия на конкретную миниатюру открывается ее большая версия / изображение. На самом деле это невозможно, так как MOUSE_CLICK срабатывает каждый раз, когда пользователь перетаскивает всю панель миниатюр, так что большое изображение открывается каждый раз.

1 Ответ

2 голосов
/ 10 октября 2011

Вам необходимо добавить флаг, который указывает, находитесь ли вы в режиме перетаскивания или нет.Если пользователь удерживает нажатой в течение определенного времени (например, 300 мсек), установите флаг и затем проигнорируйте событие окончания MOUSE_CLICK.Обратите внимание, что мы используем тимут в 1 мс в обработчике MOUSE_UP, чтобы позволить событиям завершиться до сброса флага.Обратите внимание, что вам не нужен обработчик кликов;вы можете вызвать обработчик псевдо-щелчков в вашем MOUSE_UP обработчике, если dragInProgress==false.

private var dragTime:int = 300;
private var dragInProgress:Boolean = false;
private var dragInProgressInt:int;

function handleMouseDown(event:MouseEvent):void
{
    dragInProgressInt = setTimeout(function():void
    {
        dragInProgress = true;
    }, dragTime);

    // Start drag, etc.
}

function handleMouseUp(event:MouseEvent):void
{
    clearTimeout(dragInProgressInt);
    setTimeout(function():void
    {
        dragInProgress = false;
    }, 1);

    // End drag, etc.
}

function handleMouseClick(event:MouseEvent):void
{
    if (!dragInProgress)
    {
        // Handle the real click
    }
}

Логическим следующим шагом будет ожидание, например, 300 мсек, прежде чем даже начинать перетаскивание в первую очередь;это позволит избежать ненужного запуска / остановки операции перетаскивания, когда все пользователи хотят щелкнуть.

Редактировать: Исправлена ​​ошибка в ссылках на имя тайм-аута.

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