我的界面顶部有一个DisplayObject,它显示调试信息(每秒帧数等),半透明,alpha值为60%。
我想与此表面下的项目进行交互,这样当鼠标滚过它时,它会变暗到10%alpha,鼠标事件会通过它传递给底层对象。
通常,我将此调试信息面板的mouseEnabled和mouseChildren属性设置为false,因此其下的对象会收到鼠标事件。
问题是,为了在鼠标滑过它时隐藏它,它需要将mouseEnabled设置为true。但是,如果mouseEnabled为true,则鼠标事件不会被其下方的对象拾取。
据我所知,我无法有选择地启用mouseEvents,因此它要么全部接收它们,要么都不接收它们。这意味着如果采用这种方法,我必须处理和转发所有事件。
我真的希望mouseEnabled属性具有“peek”模式或其他东西,以便它可以接收事件,如果它在顶部,但也允许它们传递到下面的对象。
答案 0 :(得分:1)
如果DisplayObject具有mouseEnabled=true
,则意味着其事件将被发送到其container
,而不是在对象下方。所以这个解决方案不起作用。最好的解决方案是使用getObjectsUnderPoint
手动重新路由事件,如here所述。
多年来,我一直在多点触控应用中使用这种方法。有多个触摸点,我没有看到任何处理器开销。你只有一个光标。
答案 1 :(得分:0)
我相信你正在寻找mouseEnabled = false
但是你可以做的另一个最后的尝试是鼠标移动它到屏幕的另一边。
答案 2 :(得分:0)
我感觉到你的痛苦。不幸的是,我不知道启用/禁用特定鼠标事件的方法。您可以通过该解决方案获得创意。例如,可以尝试向舞台添加MOUSE_MOVE
侦听器并跟踪鼠标的坐标。然后,如果鼠标的stageX,stageY
位于面板区域,请设置可见性。您也可以使用getObjectsUnderPoint()
来确定鼠标下面的对象。但是,我的猜测是,在每次帧迭代时,处理器上运行它会有点强烈。
答案 3 :(得分:0)
您可以采取的一种方法,虽然不是理想的,但是添加一个输入框架侦听器并检查每一帧的鼠标位置。类似的东西:
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
private function onEnterFrame(e:Event):void {
if(mouseX > width || mouseY > height){
//hide stats
}
}
答案 4 :(得分:0)
我假设你有这个显示层次结构:
Debug Window
Debug Control 1
Debug Control 2
...
Overlay
为什么不在DebugWindow上使覆盖成为掩码并将mouseEvents附加到DebugWindow本身?请参阅此页面以获得灵感:http://blog.shaperstudio.com/2010/11/as3-inverse-mask/
答案 5 :(得分:0)
我有同样的问题..我的功能是检查鼠标是否超过某个对象:
public function isMouseOverObject(mPos: Point, pObject:DisplayObject, pContainer:DisplayObjectContainer) {
var under_objects:Array = pContainer.getObjectsUnderPoint(mPos);
var is_under:Boolean = false;
for (var i:int = 0; i < under_objects.length; i++) {
if (under_objects[i] == pObject) {
is_under = true;
break;
}
}
return is_under;
}