如何检测Event.MOUSE_LEAVE时的wmode =不透明或的wmode =透明
问题描述:
我有一个定制的拖动事件,对大多数事情的伟大工程:如何检测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=transparent
或wmode=opaque
MOUSE_UP
事件发生在舞台外时,未检测到MOUSE_LEAVE
事件。
当wmode
是transparent
或opaque
时,有没有办法检测到MOUSE_LEAVE
事件?
OR
有没有办法来检测,这样一个变通办法可以实现该wmode
设置为transparent
或opaque
?
答
默认情况下,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的组合,对于任何其他设置,您必须检查并可能找到解决方法。
@weltraumpirat在此之前,我从来没有发现MOUSE_LEAVE事件是不可靠的。当MOUSE_LEAVE事件被触发时,许多人都会感到困惑,因为当MOUSE_UP事件发生时,鼠标离开舞台而用户正在拖动鼠标时发生。我发现,当鼠标离开'wmode = transparent/opaque'中的舞台时,不处理鼠标事件,所以这种方法不太可能奏效(尽管我仍会试试)。 – zzzzBov 2011-03-26 18:13:47
如果您遇到任何问题,您可以随时使用ENTER_FRAME监听器。如果可以的话,我更喜欢使用MOUSE_MOVE,因为它不是经常被解雇。 – weltraumpirat 2011-03-26 21:36:38
@weltraumpirat,当鼠标离开舞台时(即使是MOUSE_OUT事件),都不会触发鼠标事件。如果释放或按下鼠标,则新鼠标事件也不会为'buttonDown'注册正确的值。我看不到'ENTER_FRAME'监听器如何提供帮助。 – zzzzBov 2011-03-30 19:08:47