我正在Flash CS5中构建一个小应用程序,但我遇到了一个问题。我已将由设计人员创建的相当复杂的Adobe Illustrator文件导入到我的应用程序中。这个文件充满了我可以在Flash中操作的各种图像,文本和其他组件。
我的应用程序中有一个组件,包含一个包含基本方块的组,其上面有文本,我想将其制作成热点,用户可以将鼠标悬停在其上并触发显示的工具提示。我已将整个组转换为MovieClip,这将触发工具提示在MOUSE_OVER上显示。它唯一的窒息点是当用户触发它时。
出于某种原因,每当我将指针移到MovieClip的不同区域时,都会多次调用MOUSE_OVER事件。例如,鼠标悬停在背景上会触发一次,然后将鼠标悬停在文本的不同区域会多次触发,即使所有这些组件都在一个MovieClip中组合在一起。
如何让这些对象表现为一个MovieClip,以便鼠标悬停在MovieClip的任何区域上只会触发一次MOUSE_OVER事件监听器?
答案 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 - 而且这是预期的,每个项目都将本机地触发该事件,并且事件全部冒泡。查看事件冒泡以找到更多信息。
有几种方法可以解决这个问题:
useCapture
参数,根据我的经验,这将解决许多这些问题。您可以拨打addEventListener(name, callback)
而不是addEventListener(name, callback, true)
。 removeEventListener
也是如此。答案 3 :(得分:0)
作为旁注,这是由事件冒泡引起的。我是自定义MOUSE_OVER事件的粉丝,以防止这种情况发生。