所有
这是我的情况......
我的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边界内。但我猜这不是最优雅或最有效的解决方案。
这一定是一个非常普遍的问题。什么是最好的解决方案?
提前致谢!
答案 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
个对象。
答案 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
}
}
没有测试它,但它应该工作