Event.MOUSE_LEAVE 在 AS3 中不起作用

Posted

技术标签:

【中文标题】Event.MOUSE_LEAVE 在 AS3 中不起作用【英文标题】:Event.MOUSE_LEAVE not working in AS3 【发布时间】:2011-02-05 11:06:22 【问题描述】:

我只是将这个超级简单的代码示例扔到 Flash CS4 IDE 框架脚本中,但它不会在控制台中输出任何内容。我只是在窗口上滚动鼠标,没有点击任何东西,什么也没有发生。为什么这不符合我的预期?

stage.addEventListener(Event.MOUSE_LEAVE, traceMouse);

function traceMouse(Evt:Event):void
 
 trace("Mouse Left Stage");
 

________________________________________________

[EDIT] 我发现 Event.MOUSE_LEAVE 毫无用处。首先,它在测试环境中不起作用(至少在 Mac OS X 的 Flash CS4 上)。其次,如果 MouseEvent.MOUSE_DOWN 当前处于活动状态,它不会触发:

Flash CS4 Professional ActionScript 3.0 语言参考:

2009 年 8 月 11 日更新:添加了资格 按钮时不会触发该事件 按下。1

在我的特殊情况下,我希望在拖动对象时触发 MOUSE_LEAVE,以便在用户将他/她的鼠标指针拖离舞台时,它会触发 stopDrag()。因为这是不可能的,所以我决定在实际对象上使用 MOUSE_OUT,而不是在对象的父级或舞台上使用 MOUSE_LEAVE。

 private function mouseDownHandler(evt:MouseEvent):void
  
  object.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  object.startDrag(false, pullBounds);
  

 private function mouseUpHandler(evt:MouseEvent):void
  
  object.removeEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  object.stopDrag();
  

 private function mouseOutHandler(evt:MouseEvent):void
  
  object.stopDrag();
  

【问题讨论】:

它适用于我的 Flash CS4 IDE (Win XP),但事实上它在按下鼠标时不起作用,这使得它完全没用。 Adobe 这些天真的很烦我。顺便说一句,你在哪里找到的笔记?那个链接失效了。 它是在 flash.display.Stage.mouseLeave 下的 Flash 10.1 的 10.0 文档中编写的,但他们似乎已将其删除。 【参考方案1】:

这里有一些额外的棘手的事情要知道(在浏览器中运行时):

奇怪的是,在 Chrome + Firefox 中,对于 WMODE 或 OPAQUETRANSPARENT 没有调度 MOUSE_LEAVE 事件。它只是不会触发 - 鼠标向下或向上。

使用WINDOW 可以正常工作。那个我花了很长时间才发现! grr...http://bugs.adobe.com/jira/browse/FP-892


其次,确保您使用Event 作为Event.MOUSE_LEAVE 处理程序的参数类型,而不是MouseEvent。如果您尝试使用e:MouseEvent 处理MOUSE_LEAVE,您将收到一个您可能永远不会看到的错误(除非您使用的是调试Flash 播放器)。这是一个非常容易犯的错误,因为您可能将所有其他处理程序都指向同一个方法。

这就是我的工作:(只需从mouseLeave(e:Event) 调用我的主要endDrag

stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
stage.addEventListener(Event.DEACTIVATE, endDrag);
stage.addEventListener(Event.MOUSE_LEAVE, mouseLeave);

private function mouseLeave(e:Event):void

    endDrag(new MouseEvent("MOUSE_LEAVE"));


public function endDrag(evt:MouseEvent):void

    /// handle end drag

【讨论】:

@TheDarkIn1978 我知道你没有在这里犯第二个错误 - 但我总是忘记这一点,很容易错过【参考方案2】:

我认为这个特定事件在创作环境中不起作用,请尝试发布一个 html 包装器并在您的浏览器中运行它。

【讨论】:

在发布之前我用谷歌搜索了这个问题。似乎有些人无法让它与 IDE 一起工作,而另一些人则认为他们疯了,它对他们有用没问题。它可能是一个设置吗?是的,在浏览器中发布时它确实对我有用 它可能与操作系统相关或其他原因,我尽可能远离 Flash 创作代码类型的东西,所以我从来没有真正遇到过这种情况。 这是一个聪明的理论。如果您是正确的,我不会感到惊讶,因为 MouseEvent.MOUSE_WHEEL 在 Mac OS X 上根本不起作用(这是我正在使用的)

以上是关于Event.MOUSE_LEAVE 在 AS3 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Actionscript 3 中拖动时检测鼠标离开阶段

AS3:如何在 AS3 类中有效地存储平铺地图编辑器的数据

AS3 - 如何在数组中找到两个最大的数字

Flex:在 AS3 中更改 Flex 组件样式

在 AS3 中隐藏按钮?

在 DisplayObjectContainer 中识别 AS3 中的 MovieClip