我有一个定制的拖动事件,适用于大多数事情:
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
事件?
或
有没有办法检测到wmode
设置为transparent
或opaque
,以便可以实施解决方案?
答案 0 :(得分: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的组合,用于您必须检查并可能找到解决方法的任何其他设置。