如何在AS3中透明地处理mouseEvent



我在界面顶部停靠了一个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;
    }

相关内容

  • 没有找到相关文章

最新更新