Как определить, находится ли курсор мыши над компонентом, используя координаты мыши? - PullRequest
1 голос
/ 24 декабря 2011

Я пытаюсь определить с помощью события мыши, находится ли я над определенным компонентом.

Итак, сейчас у меня есть два компонента, скажем, 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 ]

4 голосов
/ 24 декабря 2011

Вы можете в любое время определить, какие объекты находятся под мышью, используя метод DisplayObjectContainer # getObjectsUnderPoint () . Эта функция возвращает массив объектов, которые лежат под указанной точкой.

Если вы используете его на сцене, он вернет все объекты в приложении, которые находятся под точкой.

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

Полагаю, что в вашем случае было бы достаточно развернуть только контейнер, в котором находятся две кнопки.

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

Обратите внимание, что кнопка сама по себе является объектом, который содержит несколько других объектов DisplayObject, и поэтому функция может возвращать что-то вроде этого:

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

Как вы можете видеть, в случае Spark Button в ней даже указан скин кнопки, а не сама кнопка. Оттуда достаточно легко добраться до Баттона.

1 голос
/ 24 декабря 2011

Я не думал, что вы сможете понять это, используя событие.MouseEvent имеет цель (Компонент, который отправил событие) и 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) Возможно, вы сможете перебрать все дочерние элементы в контейнере и выяснить это на основе свойств localX и localY MouseEvent. Я не уверен, насколько хорошподход. В событии mouseOut свойства localX и localY будут показывать координаты, где мышь оставила компонент, то есть они все еще находятся над компонентом, или они будут показывать координаты, в которые они вошли в новый компонент?Без тестирования я не уверен.Кроме того, я подозреваю, что это может привести к снижению производительности.

0 голосов
/ 27 декабря 2011

То, что я в итоге сделал (вдохновленный приведенными выше ответами), установило тайм-аут, чтобы дать мыши время для перемещения, а затем в этом тайм-обработчике с помощью 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);
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...