AS3项目 - 鼠标移动监听器在应用程序之外作出反应

时间:2009-05-30 22:40:01

标签: flex actionscript-3 listeners stage

我有一种不寻常的行为,我似乎无法深究。当我运行它时,如果我移动到swf区域,它会在鼠标移动时正常跟踪。可以预料。

但是,当我点击屏幕上的任何位置时,它会跟踪移动事件。如果我单击并拖动,它就会跟踪浏览器的swf区域。

这是代码。我简化了它的准系统。把它放在Flex中一个名为“引擎”的空AS3项目中 - 显然没有引用。

package {
import flash.display.Sprite;
import flash.events.MouseEvent;

[SWF(width='640', height='360', backgroundColor='#888888', frameRate='31')]
public class Engine extends Sprite
{       
    public function Engine()
    {
        // Add the mouse handlers
        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
    }

    public function mouseMoveHandler(evt:MouseEvent):void
    {
        trace("move");
    }
}
}

作为一种解决方法,我将MOUSE_MOVE添加到一个MOUSE_OVER并在MOUSE_OUT上删除它。但这种行为似乎仍然很不寻常,我有兴趣了解它为什么会发生。

有人能告诉我如何将事件限制在应用程序的实际阶段吗?

3 个答案:

答案 0 :(得分:1)

如前所述,您无法阻止这些事件被触发。它们会被触发,直到您释放鼠标。

你可以做的是将MouseEvent的坐标与舞台的边界进行比较,并忽略那些外部的坐标。

public function mouseMoveHandler(evt:MouseEvent):void
{
    if (evt.stageX >= 0 && evt.stageX <= stage.stageWidth &&
        evt.stageY >= 0 && evt.stageY <= stage.stageHeight)
    {
        trace("move");
    }
}

答案 1 :(得分:0)

如果您在Flash影片中单击并将鼠标拖到其外部,则MOUSE_MOVE事件将继续触发,直到您释放鼠标。只有在播放器外部释放鼠标时,MOUSE_LEAVE才会触发。这就是Flash Player的工作方式。

也许我错了,但我认为你不能改变这种行为。

答案 2 :(得分:0)

好的,这是一个只在Mac上发生的已知错误。

这里有一个修复:

http://www.visible-form.com/blog/transformmanager-fix-for-mac-firefox/