2011-03-25 76 views
0

我有一个定制的拖动事件,对大多数事情的伟大工程:如何检测Event.MOUSE_LEAVE时的wmode =不透明或的wmode =透明

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=transparentwmode=opaqueMOUSE_UP事件发生在舞台外时,未检测到MOUSE_LEAVE事件。

wmodetransparentopaque时,有没有办法检测到MOUSE_LEAVE事件?

OR

有没有办法来检测,这样一个变通办法可以实现该wmode设置为transparentopaque

回答

0

默认情况下,MOUSE_LEAVE不是可靠的事件。有时会被解雇,而在其他时候则不会。您可以在整个网络上使用find complaints about this

有一两件事可以做,不过,那是手动检查,如果鼠标在舞台:

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变量以防止事件处理程序的双重执行。

P.S.我不确定这适用于所有stage.align和stage.scaleMode选项。它应该适用于StageScaleMode.NO_SCALE和StageAlign.TOP_LEFT的组合,对于任何其他设置,您必须检查并可能找到解决方法。

+0

@weltraumpirat在此之前,我从来没有发现MOUSE_LEAVE事件是不可靠的。当MOUSE_LEAVE事件被触发时,许多人都会感到困惑,因为当MOUSE_UP事件发生时,鼠标离开舞台而用户正在拖动鼠标时发生。我发现,当鼠标离开'wmode = transparent/opaque'中的舞台时,不处理鼠标事件,所以这种方法不太可能奏效(尽管我仍会试试)。 – zzzzBov 2011-03-26 18:13:47

+0

如果您遇到任何问题,您可以随时使用ENTER_FRAME监听器。如果可以的话,我更喜欢使用MOUSE_MOVE,因为它不是经常被解雇。 – weltraumpirat 2011-03-26 21:36:38

+0

@weltraumpirat,当鼠标离开舞台时(即使是MOUSE_OUT事件),都不会触发鼠标事件。如果释放或按下鼠标,则新鼠标事件也不会为'buttonDown'注册正确的值。我看不到'ENTER_FRAME'监听器如何提供帮助。 – zzzzBov 2011-03-30 19:08:47