2011-03-25 48 views
0

我有一個定製的拖動事件,對大多數事情的偉大工程:如何檢測Event.MOUSE_LEAVE時的wmode =不透明或的wmode =透明

stage.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag); 

function beginDrag(e:MouseEvent) 
{ 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.addEventListener(MouseEvent.DEACTIVATE, endDrag); 
    stage.addEventListener(Event.MOUSE_LEAVE, endDrag); 
    stage.addEventListener(Event.REMOVED_FROM_STAGE, stageEndDrag); 

    //trigger beginDrag event 
} 
function drag(e:MouseEvent) 
{ 
    //trigger drag event 
} 
function endDrag(e:Event) 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.removeEventListener(MouseEvent.DEACTIVATE, endDrag); 
    stage.removeEventListener(Event.MOUSE_LEAVE, endDrag); 
    stage.removeEventListener(Event.REMOVED_FROM_STAGE, stageEndDrag); 

    //trigger endDrag event 
} 

的問題是,當我使用這個代碼wmode=transparentwmode=opaqueMOUSE_UP事件發生在舞臺外時,未檢測到MOUSE_LEAVE事件。

wmodetransparentopaque時,有沒有辦法檢測到MOUSE_LEAVE事件?

OR

有沒有辦法來檢測,這樣一個變通辦法可以實現該wmode設置爲transparentopaque

回答

0

默認情況下,MOUSE_LEAVE不是可靠的事件。有時會被解僱,而在其他時候則不會。您可以在整個網絡上使用find complaints about this

有一兩件事可以做,不過,那是手動檢查,如果鼠標在舞臺:

var out : Boolean = false; 

stage.addEventListener (Event.ENTER_FRAME, checkMouse); 

function checkMouse (ev:Event) : void { 
    if (
     stage.mouseX < 0 || 
     stage.mouseX > stage.stageWidth || 
     stage.mouseY < 0 || 
     stage.mouseY > stage.stageHeight) 
    { 
     if (!out) 
     { 
      out = true; 
      stage.dispatchEvent (new Event(Event.MOUSE_LEAVE)); 
     } 
    } 
    else if (out) 
    { 
     out = false; 
     stage.dispatchEvent (new Event("mouseEnter")); 
    } 
} 

當光標位於舞臺區域外這將派遣MOUSE_LEAVE事件,以及自定義的「mouseEnter」事件,當它重新進入。然後,您可以將事件監聽器添加到舞臺以對這些事件進行可靠響應,但是您必須記住,一次可能會觸發多個MOUSE_LEAVE(如果自定義代碼和內置代碼都已執行)。您可以檢查out變量以防止事件處理程序的雙重執行。

P.S.我不確定這適用於所有stage.align和stage.scaleMode選項。它應該適用於StageScaleMode.NO_SCALE和StageAlign.TOP_LEFT的組合,對於任何其他設置,您必須檢查並可能找到解決方法。

+0

@weltraumpirat在此之前,我從來沒有發現MOUSE_LEAVE事件是不可靠的。當MOUSE_LEAVE事件被觸發時,許多人都會感到困惑,因爲當MOUSE_UP事件發生時,鼠標離開舞臺而用戶正在拖動鼠標時發生。我發現,當鼠標離開'wmode = transparent/opaque'中的舞臺時,不處理鼠標事件,所以這種方法不太可能奏效(儘管我仍會試試)。 – zzzzBov 2011-03-26 18:13:47

+0

如果您遇到任何問題,您可以隨時使用ENTER_FRAME監聽器。如果可以的話,我更喜歡使用MOUSE_MOVE,因爲它不是經常被解僱。 – weltraumpirat 2011-03-26 21:36:38

+0

@weltraumpirat,當鼠標離開舞臺時(即使是MOUSE_OUT事件),都不會觸發鼠標事件。如果釋放或按下鼠標,則新鼠標事件也不會爲'buttonDown'註冊正確的值。我看不到'ENTER_FRAME'監聽器如何提供幫助。 – zzzzBov 2011-03-30 19:08:47

相關問題