如何使用鼠标坐标判断鼠标光标是否在组件上?

时间:2011-12-23 22:06:43

标签: flex flex4

我试图在鼠标事件的帮助下确定我是否超过了特定组件。

所以现在我有两个组件,比如说buttonA和buttonB。 ButtonA上有一个监听器,已经在监听鼠标输出事件。 ButtonB与ButtonA的边缘齐平。

我需要找出它的代码。这是更多细节:

        protected function _mouseOutHandler(event:MouseEvent):void
        {
            if (data.subCategories.length>0)
            {
                if (MOUSE IS NOT OVER BUTTONB) {

                }

                if (MOUSE IS OVER DROPDOWNB) {

                }
            }
        }

3 个答案:

答案 0 :(得分:4)

您可以随时使用DisplayObjectContainer#getObjectsUnderPoint()方法确定鼠标下的对象。此函数返回位于指定点下的对象Array。

我在舞台上使用它,它将返回应用程序中的所有对象。

stage.getObjectsUnderPoint(new Point(mouseX, mouseY));

我想在你的情况下,仅从容纳两个按钮的容器向下钻取就足够了。

myGroupWithButtons.getObjectsUnderPoint(new Point(mouseX, mouseY));

请注意,Button本身就是一个包含多个其他DisplayObject的对象,因此函数可能返回如下内容:

myGroupWithButtons.myBtn.ButtonSkin8, [object Shape], [object Shape]

正如您所看到的,在Spark按钮的情况下,它甚至可以列出Button的外观而不是Button本身。从那里到按钮很容易。

答案 1 :(得分:1)

我认为你不能用这个事件来解决这个问题。 MouseEvent具有目标(调度事件的Component)和currentTarget(添加了侦听器的组件);但是在鼠标输出事件的情况下;这些都不是鼠标当前所在的项目;而是鼠标过去的项目。

要考虑的几个选项:

1)你能听到其他组件上的mouseOver事件吗?如果是这样,那么您可以使用event.target。像这样:

        protected function _mouseInHandler(event:MouseEvent):void
        {
            if (data.subCategories.length>0)
            {
//                if (MOUSE IS NOT OVER BUTTONB) {
                if (event.target is BUTTONB) {

                }

//                if (MOUSE IS OVER DROPDOWNB) {
                if (event.target is DROPDOWNB) {

                }
            }
        }

2)你可能能够遍历容器中的所有子节点并根据MouseEvent的localX和localY属性找出它我不确定方法有多好。在mouseOut事件中, localX和localY属性是否会显示鼠标离开组件的坐标 - 这意味着它们仍在组件上方,或者它们是否显示了它们进入新组件的坐标?没有测试我不确定。此外,我怀疑这可能会导致性能下降。

答案 2 :(得分:0)

我最终做的事情(灵感来自上述回复)是设置超时以使鼠标有时间旅行,然后在该超时处理程序中使用hitTestPoint来检查鼠标是否在任何组件之上。这是代码:

        private var timeout:uint;

        /**
         * On mouse out of item renderer set timeout 
         * */
        protected function _mouseOutHandler(event:MouseEvent):void {

            if (data.subCategories.length>0) {
                timeout = setTimeout(checkToClose, 150);
            }
        }

        /**
         * Handles when mouse moves out of drop down
         * */
        protected function _menuMouseOutHandler(event:MouseEvent):void {
            checkToClose();
        }

        /**
         * Check if mouse is out of drop down and category renderer
         * */
        public function checkToClose():void {
            var point:Point;

            clearTimeout (timeout);

            // check if drop down is open
            if (menu.dropDown) {
                point = localToGlobal(new Point(mouseX, mouseY));
                menu.dropDown.addEventListener(MouseEvent.MOUSE_OUT, _menuMouseOutHandler, false, 0, true);

                // check if we are over drop down or category renderer
                // if not close dropdown
                if (!menu.dropDown.hitTestPoint(point.x, point.y)
                    && !hitTestPoint(point.x, point.y)) {
                    menu.dropDown.removeEventListener(MouseEvent.MOUSE_OUT, _menuMouseOutHandler);
                    menu.closeDropDown(false);
                }
            }
        }