Каждый MOUSE_DOWN гарантирует MOUSE_UP? - PullRequest
2 голосов
/ 14 июля 2011

При каких обстоятельствах приложение Flash может получить два MouseEvent.MOUSE_DOWN без MouseEvent.MOUSE_UP между ними?

В моем приложении ActionScript 3 я хочу отслеживать, как пользователь перетаскивает спрайт. Мой план состоит в том, чтобы прослушать MouseEvent.MOUSE_DOWN, запустить бесконечно повторяющийся таймер, который записывает положение мыши, и остановить таймер на MouseEvent.MOUSE_UP. Это хороший план?

Ответы [ 4 ]

5 голосов
/ 14 июля 2011
  • Нажмите, но не отпускайте кнопку.
  • Удерживая кнопку, переместите курсор наружу.
  • Отпустите кнопку снаружи.
  • Вернитесь внутрьи нажмите еще раз.

Вы получите два события вниз без события вверх.

Лучшим решением для перетаскивания может быть прослушивание события MOUSE_MOVE, а в обработчике события проверьте свойство buttonDown.Если кнопка движется вниз, это будет правда, иначе ложь.

РЕДАКТИРОВАТЬ: для сцены, даже если вы отпустите кнопку за пределами окна флэш-памяти, то событие Up запускается.Так что для стадии это может работать, но все же вместо таймера использование MOUSE_MOVE с buttonDown выглядит мне лучше.Вы можете проверить себя с помощью следующего кода:

public class StageEventTest extends Sprite
{
    public function StageEventTest()
    {
        stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
        stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
    }

    private function onDown(evt:MouseEvent):void {
        trace("down");
    }

    private function onUp(evt:MouseEvent):void {
        trace("up");
    }

    private function onMove(evt:MouseEvent):void {
        trace("move", evt.buttonDown);
    }
}
4 голосов
/ 14 июля 2011

он пропустит событие мыши, если мышь находится за пределами сцены, и продолжит отслеживание мыши при наведении курсора на сцену, поскольку событие мыши никогда не вызывалось. эту вероятную проблему можно решить с помощью Event.MOUSE_LEAVE - перенаправить событие отпускания мыши в обработчик событий повышения мыши, чтобы, если пользователь отошел от сцены, было вызвано событие повышения мыши.

2 голосов
/ 14 июля 2011

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

ObjectToDrag.addEventListener(MouseEvent.MOUSE_DOWN, startCustomDrag);

public function startCustomDrag(e:MouseEvent):void
{
    _prevX= e.stageX;
    _prevY= e.stageY;

    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); //REPLACE BY TIMER OR Event.ENTER_FRAME
    stage.addEventListener(MouseEvent.MOUSE_UP, stopCustomDrag);
}

private function dragObject(e:MouseEvent):void
{
    ObjectToDrag.x += _prevX - e.stageX; //OR ANY OTHER CALCULATION
    ObjectToDrag.y += _prevY - e.stageY; //OR ANY OTHER CALCULATION

    _prevX= e.stageX;
    _prevY= e.stageY;
}

public function stopCustomDrag(e:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject); //REPLACE BY TIMER OR Event.ENTER_FRAME
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopCustomDrag);
}
2 голосов
/ 14 июля 2011

Да, но если вы не слушаете сцену, я думаю, вы можете пропустить событие mouseup, если мышь вышла за пределы фильма Flash. Ничто не сравнится с экспериментом, хотя.

...