我在界面顶部停靠了一个DisplayObject,它显示调试信息(每秒帧数等),并且是半透明的,alpha为60%。
我想与这个表面下的项目交互,这样当鼠标在它上面滚动时,它会变暗到10%的alpha,鼠标事件会通过它传递到底层对象。
通常,我会将这个调试信息面板的mouseEnabled和mouseChildren属性设置为false,这样它下面的对象就会接收鼠标事件。
问题是,为了在鼠标滚动时隐藏它,它需要将mouseEnabled设置为true。但是,如果mouseEnabled为true,则鼠标事件不会被它下面的对象拾取
据我所知,我不能选择性地启用mouseEvents,所以它要么全部接收,要么不接收。这意味着,如果我采取这种方法,我将不得不处理和转发所有事件。
我真的希望mouseEnabled属性有一个"peek"模式之类的,这样它就可以在顶部接收事件,但也允许它们传递到下面的对象。
如果DisplayObject具有mouseEnabled=true
,则意味着其事件将发送到其container
,而不是发送到对象下面的内容。所以这个解决方案是行不通的。最好的解决方案是使用getObjectsUnderPoint
手动重新路由其中的事件,如本文所述。
多年来,我一直在多点触控应用程序中使用这种方法。对于多个触摸点,我看不到任何处理器开销。你只有一个光标。
我感觉到你的痛苦。不幸的是,我不知道有什么方法可以启用/禁用特定的鼠标事件。不过,你可以在解决方案上发挥创意。例如,可以尝试将MOUSE_MOVE
侦听器添加到您的舞台并跟踪鼠标的坐标。然后,如果鼠标的stageX,stageY
位于面板的区域中,则设置可见性。您还可以使用getObjectsUnderPoint()
来确定鼠标下的对象。但是,我的猜测是,在每次帧迭代中运行它会对处理器产生一点影响。
我相信您正在寻找mouseEnabled = false
但你可以做的另一个最后的尝试是将鼠标移到屏幕的另一边。
您可以采取的一种方法,尽管并不理想,但就是添加一个enter-frame侦听器,并在每帧中检查鼠标位置。类似的东西
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
private function onEnterFrame(e:Event):void {
if(mouseX > width || mouseY > height){
//hide stats
}
}
我假设您有这样的显示层次结构:
Debug Window
Debug Control 1
Debug Control 2
...
Overlay
为什么不将覆盖作为DebugWindow上的掩码,并将mouseEvents附加到DebugWindow本身?有关灵感,请参阅本页:http://blog.shaperstudio.com/2010/11/as3-inverse-mask/
我也遇到了同样的问题。。我做了一个功能来检查是鼠标悬停在某个对象上:
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;
}