2011-12-23 80 views
1

我试图确定与鼠标事件的帮助,如果我在一个特定的组件。如何判断鼠标光标是否位于使用鼠标坐标的组件上?

所以现在我有两个组件,比方说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) { 

       } 
      } 
     } 

回答

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); 
       } 
      } 
     } 
1

我不认为你可以使用该事件了解这一点。 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)你也许可以遍历所有的孩子在容器中并且弄明白基础上的MouseEvent的localX和localY属性我不知道有多好做法的是在mouseOut事件中,localX和localY属性会显示鼠标离开组件的坐标 - 意味着它们仍然在组件上,或者它们将显示它们输入新组件的坐标?没有测试,我不确定。另外,我怀疑这可能会导致性能下降。

4

您可以随时使用DisplayObjectContainer#getObjectsUnderPoint()方法确定鼠标下面有什么对象。该函数返回位于指定点下的一个对象数组。

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

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

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

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

注意,一个按钮本身包含几个其他的DisplayObject和对象的功能,从而可能会返回是这样的:

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

正如你所看到的,在火花按钮的情况下,甚至列出了Button的皮肤而不是Button本身。虽然很容易从那里进入Button。

+0

这就是我要回落。不幸的是,它不会每次都有效。如果一个组或对象是透明的,它将会错过该对象。如果有人使用此方法,则需要检查owner属性以获取组件(不是父项,尽管它们可以相同)。 – 2011-12-27 17:07:00

+0

@ 1。21千兆如果它真的是透明的,那么按钮就会丢失,但是如果你只是在其皮肤上填充一个“Rect”并将它的alpha设置为0,它将会被击中。 – RIAstar 2011-12-27 21:08:50