我有一个定制的拖动事件,它对大多数事情都很有用:
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事件。
当MOUSE_LEAVE是transparent或opaque时,有没有检测transparent事件的方法?
或
是否有一种方法可以检测wmode是否设置为transparent或opaque,以便可以实现工作?
发布于 2011-03-26 16:20:27
默认情况下,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变量以防止事件处理程序的双重执行。
我不确定这是否适用于所有的stage.align和stage.scaleMode选项。它应该适用于StageScaleMode.NO_SCALE和StageAlign.TOP_LEFT的组合,对于您必须检查并可能找到解决办法的任何其他设置。
https://stackoverflow.com/questions/5436360
复制相似问题