0

我有一个自定义的拖动事件,它适用于大多数事情:

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_LEAVEMOUSE_UP

有没有办法在is或MOUSE_LEAVE时检测事件?wmodetransparentopaque

或者

有没有办法检测到wmode设置为transparentopaque可以实施解决方法?

4

1 回答 1

0

默认情况下,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 的组合,对于您必须检查并可能找到解决方法的任何其他设置。

于 2011-03-26T16:20:27.820 回答