Flash中的MovieClip MOUSE_OVER问题

时间:2011-08-15 14:07:59

标签: flash actionscript-3 actionscript mouse mouseevent

我正在Flash CS5中构建一个小应用程序,但我遇到了一个问题。我已将由设计人员创建的相当复杂的Adobe Illustrator文件导入到我的应用程序中。这个文件充满了我可以在Flash中操作的各种图像,文本和其他组件。

我的应用程序中有一个组件,包含一个包含基本方块的组,其上面有文本,我想将其制作成热点,用户可以将鼠标悬停在其上并触发显示的工具提示。我已将整个组转换为MovieClip,这将触发工具提示在MOUSE_OVER上显示。它唯一的窒息点是当用户触发它时。

出于某种原因,每当我将指针移到MovieClip的不同区域时,都会多次调用MOUSE_OVER事件。例如,鼠标悬停在背景上会触发一次,然后将鼠标悬停在文本的不同区域会多次触发,即使所有这些组件都在一个MovieClip中组合在一起。

如何让这些对象表现为一个MovieClip,以便鼠标悬停在MovieClip的任何区域上只会触发一次MOUSE_OVER事件监听器?

4 个答案:

答案 0 :(得分:2)

实际上你可以使用ROLL_OVER来做同样的事情,而不需要前景剪辑。如果您已将项目分组到MovieClip中,则只需为MouseEvent.ROLL_OVER添加一个监听器。它不仅可以像你想的那样工作,而且意味着额外的前景剪辑不那么杂乱,因为我个人总是喜欢尽可能干净的代码,如果可能的话。

movieclip.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);

function onRollOverHandler(e:MouseEvent):void
{
    // this will run once when you move your mouse over the movieclip
}

然后只需使用此功能的相反功能即可在鼠标移出MovieClip时进行处理。

movieclip.addEventListener(MouseEvent.ROLL_OUT, onRollOutHandler);

function onRollOutHandler(e:MouseEvent):void
{
    // this will run once when you move your mouse off of the movieclip
}

答案 1 :(得分:1)

如果您的MovieClip中的对象不需要处于活动状态,则可以使用

yourMC.mouseChildren=false;
yourMC.addEventListener(MouseEvent.MOUSE_OVER,yourOverHandlerFunction);

答案 2 :(得分:0)

问题是每个项目都在触发MOUSE_OVER - 而且这是预期的,每个项目都将本机地触发该事件,并且事件全部冒泡。查看事件冒泡以找到更多信息。

有几种方法可以解决这个问题:

  1. 创建一个前景剪辑并改为收听。在我看来,这是迄今为止最好的选择。
  2. 您可以使用useCapture参数,根据我的经验,这将解决许多这些问题。您可以拨打addEventListener(name, callback)而不是addEventListener(name, callback, true)removeEventListener也是如此。
  3. 手动事件追踪!作为最后的武器,它以最差的性能和最头痛的代价提供最高的可靠性。这将涉及或多或少的全局事件监听器和命中测试。只有绝望才能使用。

答案 3 :(得分:0)

作为旁注,这是由事件冒泡引起的。我是自定义MOUSE_OVER事件的粉丝,以防止这种情况发生。