4

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

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

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

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

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

我真的希望 mouseEnabled 属性具有“窥视”模式或其他东西,这样它就可以接收位于顶部的事件,但也允许它们传递到下面的对象。

4

6 回答 6

1

如果 DisplayObject 有mouseEnabled=true,则意味着它的事件将被发送给它container,而不是对象下面的任何东西。所以这个解决方案行不通。最好的解决方案是使用此处getObjectsUnderPoint描述的手动重新路由事件。

多年来,我一直在多点触控应用程序中使用这种方法。对于多个接触点,我看不到任何处理器开销。你只有一个光标。

于 2012-03-09T08:52:43.553 回答
0

我相信您正在寻找mouseEnabled = false
但是您可以做的最后一次尝试是在鼠标悬停时将其移动到屏幕的另一侧。

于 2012-03-08T23:01:41.703 回答
0

您可以采取的一种方法(虽然并不理想)是添加一个输入帧侦听器并检查每一帧的鼠标位置。类似于:

stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);


private function onEnterFrame(e:Event):void {
    if(mouseX > width || mouseY > height){
        //hide stats
    }
}
于 2012-03-08T23:46:32.230 回答
0

我感觉到你的痛苦。不幸的是,我不知道启用/禁用特定鼠标事件的方法。不过,您可以通过该解决方案获得创意。例如,也许尝试MOUSE_MOVE在您的舞台上添加一个监听器并跟踪鼠标的坐标。然后,如果stageX,stageY鼠标位于面板区域,请设置可见性。您可能还可以getObjectsUnderPoint()用来确定鼠标下方的对象。但是,我的猜测是,在每帧迭代中运行处理器会变得有点紧张。

于 2012-03-08T23:11:13.243 回答
0

我假设你有这个显示层次结构:

Debug Window
    Debug Control 1
    Debug Control 2
    ...
    Overlay

为什么不在 DebugWindow 上将覆盖设置为掩码,并将 mouseEvents 附加到 DebugWindow 本身?请参阅此页面以获取一些灵感:http: //blog.shaperstudio.com/2010/11/as3-inverse-mask/

于 2012-03-09T00:01:49.107 回答
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;
    }
于 2013-11-25T08:10:22.917 回答