Как обнаружить Event.MOUSE_LEAVE, когда wmode = непрозрачный или wmode = прозрачный - PullRequest
0 голосов
/ 25 марта 2011

У меня есть персонализированное событие перетаскивания, которое отлично подходит для большинства вещей:

stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );

function beginDrag( e:MouseEvent )
{
  stage.addEventListener( MouseEvent.MOUSE_MOVE, drag );
  stage.addEventListener( MouseEvent.MOUSE_UP, endDrag );
  stage.addEventListener( MouseEvent.DEACTIVATE, endDrag );
  stage.addEventListener( Event.MOUSE_LEAVE, endDrag );
  stage.addEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );

  //trigger beginDrag event
}
function drag( e:MouseEvent )
{
  //trigger drag event
}
function endDrag( e:Event )
{
  stage.removeEventListener( MouseEvent.MOUSE_MOVE, drag );
  stage.removeEventListener( MouseEvent.MOUSE_UP, endDrag );
  stage.removeEventListener( MouseEvent.DEACTIVATE, endDrag );
  stage.removeEventListener( Event.MOUSE_LEAVE, endDrag );
  stage.removeEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );

  //trigger endDrag event
}

Проблема в том, что когда я использую этот код с wmode=transparent или wmode=opaque, событие MOUSE_LEAVE не обнаруживается, когда событие MOUSE_UP происходит вне сцены.

Есть ли способ обнаружить событие MOUSE_LEAVE, когда wmode равно transparent или opaque?

OR

Есть ли способ обнаружить, что для wmode установлено значение transparent или opaque, чтобы можно было обойти это решение?

1 Ответ

0 голосов
/ 26 марта 2011

По умолчанию MOUSE_LEAVE не является надежным событием.Иногда его увольняют, а иногда нет.Вы можете найти жалобы по этому поводу по всей сети.

Однако есть одна вещь, которую вы можете сделать, а именно проверить вручную, находится ли мышь над сценой:

var out : Boolean = false;

stage.addEventListener (Event.ENTER_FRAME, checkMouse);

function checkMouse (ev:Event) : void {
    if (
        stage.mouseX < 0 || 
        stage.mouseX > stage.stageWidth || 
        stage.mouseY < 0 || 
        stage.mouseY > stage.stageHeight) 
    {
        if (!out) 
        {
            out = true;
            stage.dispatchEvent (new Event(Event.MOUSE_LEAVE));
        }
    } 
    else if (out) 
    {
        out = false;
        stage.dispatchEvent (new Event("mouseEnter"));
    }
}

Это отправит событие MOUSE_LEAVE, когда курсор находится за пределами области действия, и пользовательское событие "mouseEnter", когда он снова войдет.Затем вы можете добавить прослушиватели событий на сцену, чтобы надежно реагировать на эти события, но вы должны помнить, что одновременно может запускаться более одного MOUSE_LEAVE (если выполняются как пользовательский, так и встроенный).Вы можете проверить переменную out, чтобы предотвратить двойное выполнение обработчиков событий.

PS Я не уверен, что это работает для всех параметров stage.align и stage.scaleMode.Он должен работать для комбинации StageScaleMode.NO_SCALE и StageAlign.TOP_LEFT, для любых других настроек, которые вы должны будете проверить и, возможно, найти обходной путь.

...