Flash AS3:如何在mouse_over子精灵时阻止MouseEvent.MOUSE_OUT

时间:2011-09-25 17:08:35

标签: flash actionscript-3

所有

这是我的情况......

我的Flash应用程序的UI是一个网格。网格的每一行都是一个精灵,其中包含许多响应鼠标事件的子精灵(UI控件)

网格的每一行都应该有悬停效果 - 也就是说,当您将鼠标悬停在该行上时,该行的背景应该会改变颜色。

这很容易实现:

rowSprite.addEventListener(MouseEvent.MOUSE_OVER, highlightRow, false, 0, true);
rowSprite.addEventListener(MouseEvent.MOUSE_OUT, unhighlightRow, false, 0, true);

这样可以正常工作,除了当用户滚动任何行的子精灵时,行的MOUSE_OUT事件被触发,行被“取消突出显示”。这不是我想要的。

换句话说 - 只有当您滚动行的 OUTSIDE 时,我喜欢才会突出显示该行,而不是当您滚动行中的子精灵时

一种可能的解决方案:在unhighlightRow函数中,测试用户的鼠标位置是否仍在行sprite边界内。但我猜这不是最优雅或最有效的解决方案。

这一定是一个非常普遍的问题。什么是最好的解决方案?

提前致谢!

4 个答案:

答案 0 :(得分:7)

在这种情况下,您可以使用ROLL_OVER和ROLL_OUT代替MOUSE_OVER和MOUSE_OUT:

http://kinderas.blogspot.com/2008/12/quicktip-mouseover-vs-rollover.html

答案 1 :(得分:2)

是的,这是一个非常常见的问题,Adobe提供了解决方案。

您可以使用mouseChildren属性 - 将其设置为false,以防止孩子生成(是,生成)与鼠标相关的事件,在您的情况下,这些事件可以帮助您避免不必要的mouseOut事件因为当光标进入子区域时不会生成对应的mouseOver事件。

mouseChildren可用于DisplayObjectContainer个对象。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#mouseChildren

答案 2 :(得分:1)

禁用子级接收设置的鼠标事件。 那可以解决你的问题:

rowSprite.mouseChildren = false;

答案 3 :(得分:0)

rowSprite.addEventListener(MouseEvent.MOUSE_OVER, highlightRow, false, 0, true);
rowSprite.addEventListener(MouseEvent.MOUSE_OUT, unhighlightRow, false, 0, true);

function unhighlightRow (e:MouseEvent):void {
   if(Sprite(e.target).contains(e.currentTarget)) {
      return
   }
}

没有测试它,但它应该工作