Какие события flash могут прервать событие mouse_up и как их обнаружить? - PullRequest
1 голос
/ 07 декабря 2010

Упрощенный код:

//triggered on MouseEvent.MOUSE_DOWN
private function beginDrag(e:MouseEvent):void
{
  stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.addEventListener(Event.DEACTIVATE, endDrag);
  contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

private function drag(e:MouseEvent):void
{
  //do stuff
}

private function endDrag(e:Event):void
{
  stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.removeEventListener(Event.DEACTIVATE, endDrag);
  contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

Я использую несколько техник щелчка и перетаскивания в моем флеш-коде, и я заметил некоторые лазейки с событием MOUSE_UP:

  • оно не будет запущено, если контекстное меню активировано, когда мышь еще нажата.
  • оно не будет запущено, если окно деактивировано (alt + tab или аналогичное)

Мой вопрос таков: какие другие события могут прервать событие MOUSE_UP и привести к неожиданному поведению?

Кроме того, существует ли способ общего перехвата ContextMenuEvent.MENU_SELECT для все контекстные меню без необходимости вручную добавлять / удалять слушателей для каждого контекстного меню?

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

этот код может помочь
я закомментировал все ненужное с /* */
вы можете обновить этот код, если он не соответствует вашей ситуации

0 голосов
/ 13 мая 2011

Существует большая проблема с MOUSE_LEAVE: если удерживать мышь нажатой, то MOUSE_LEAVE не срабатывает.

Это то, что я делаю для имитации MOUSE_LEAVE во время перетаскивания. К счастью, stage.mouseX и stage.mouseY обновляются, когда мышь еще не нажата. Для некоторых браузеров вам, вероятно, понадобится MOUSE_LEAVE.

    public function beginDrag(evt:MouseEvent):void
    {
        stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
        stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
        stage.addEventListener(Event.DEACTIVATE, endDrag);
        stage.addEventListener(Event.MOUSE_LEAVE, endDrag);

        _dragging = true;
    }

    public function drag(evt:MouseEvent):void
    {           
        // check if mouse has fallen off stage
        if (stage.mouseX < 0 || 
            stage.mouseY < 0 || 
            stage.mouseX > stage.stageWidth || 
            stage.mouseY > stage.stageHeight)
        {
            endDrag(evt);
            ExternalInterface.call("alert", "Dropped off");
            return;
        }

        // do drag stuff here...
    }
0 голосов
/ 17 декабря 2010

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

FocusEvent.FOCUS_OUT не срабатывает до тех пор, пока после пользователь не отпустит мышь, что вызовет событие MouseEvent.MOUSE_UP.

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

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