2011-12-23 107 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