如何在AS3中透明地处理mouseEvent?

时间:2012-03-08 22:43:54

标签: actionscript-3 flash event-handling mouseevent event-passthrough

我的界面顶部有一个DisplayObject,它显示调试信息(每秒帧数等),半透明,alpha值为60%。

我想与此表面下的项目进行交互,这样当鼠标滚过它时,它会变暗到10%alpha,鼠标事件会通过它传递给底层对象。

通常,我将此调试信息面板的mouseEnabled和mouseChildren属性设置为false,因此其下的对象会收到鼠标事件。

问题是,为了在鼠标滑过它时隐藏它,它需要将mouseEnabled设置为true。但是,如果mouseEnabled为true,则鼠标事件不会被其下方的对象拾取。

据我所知,我无法有选择地启用mouseEvents,因此它要么全部接收它们,要么都不接收它们。这意味着如果采用这种方法,我必须处理和转发所有事件。

我真的希望mouseEnabled属性具有“peek”模式或其他东西,以便它可以接收事件,如果它在顶部,但也允许它们传递到下面的对象。

6 个答案:

答案 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;
    }