2012-04-29 24 views
6

我剛剛更新了Flash Player 11.2,它允許監聽MouseEvent.RIGHT_MOUSE_UP和MouseEvent.RIGHT_MOUSE_DOWN。Flash右鍵點擊的方式與左擊不同

我遇到了一個問題,這些事件的行爲與其MOUSE_UP/MOUSE_DOWN對應行爲不一樣。具體而言,無論鼠標位於何處,都會啓動MOUSE_UP事件。這允許在Flash窗口外面拖動,並且每當用戶點擊Flash播放器時仍然具有完整的向下 - >向上事件循環。

但是,對於RIGHT_MOUSE_UP/DOWN,這似乎不是這種情況。當我在播放器內右鍵單擊並釋放到播放器外部時,我沒有收到RIGHT_MOUSE_UP事件,這意味着可能會收到多個RIGHT_MOUSE_DOWN事件而沒有收到UP事件。

有沒有已知的解決方法,或者是否有我必須設置的選項?

編輯:

這裏是一個代碼示例:

stage.addEventListener(MouseEvent.MOUSE_UP,   onMouseUp); 
stage.addEventListener(MouseEvent.MOUSE_DOWN,  onMouseDown); 
stage.addeventListener(MouseEvent.RIGHT_MOUSE_UP, onRightMouseUp); 
stage.addeventListener(MouseEvent.RIGHT_MOUSE_DOWN, onRightMouseDown); 

//... 
//all callback function follow a similar format as : 
private function onMouseUp(e : MouseEvent) : void 
{ 
    leftClick_ = false;//signaling that leftClick is not pressed 
} 
+1

您確定已將'RIGHT_MOUSE_UP'偵聽器附加到'Stage',因爲這非常重要。 – xLite 2012-04-29 11:49:11

+0

你可以發佈一個片段嗎? – Chris 2012-04-29 11:54:37

+0

添加了一個顯示我的代碼如何工作的編輯。事件聽衆的確加入了舞臺。 – Godfather 2012-04-29 17:46:23

回答

2

你可以監聽當鼠標離開舞臺,它可以充當代理的RIGHT_CLICK_UP事件。

package 
{ 
    //Imports 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    //Class 
    [SWF(width="640", height="480", frameRate="60", backgroundColor="0x555555")] 
    public class RightClickTest extends Sprite 
    { 
     //Constructor 
     public function RightClickTest() 
     { 
      stage.scaleMode = StageScaleMode.NO_SCALE; 
      stage.align = StageAlign.TOP_LEFT; 

      addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     //Initialize 
     private function init(event:Event):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      stage.addEventListener(MouseEvent.RIGHT_MOUSE_DOWN, mouseRightClickEventHandler); 
      stage.addEventListener(MouseEvent.RIGHT_MOUSE_UP, mouseRightClickEventHandler); 
      stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveEventHandler); 
     } 

     //Mouse Right Click Event Handler 
     private function mouseRightClickEventHandler(event:MouseEvent):void 
     { 
      switch (event.type) 
      { 
       case MouseEvent.RIGHT_MOUSE_DOWN: trace("Right Mouse Down"); 
                break; 

       case MouseEvent.RIGHT_MOUSE_UP:  trace("Right Mouse Up"); 
      } 
     } 

     //Mouse Leave Event Handler 
     private function mouseLeaveEventHandler(event:Event):void 
     { 
      trace("Mouse Leave"); 
     } 
    } 
} 

但是,如果你想避免讓用戶來顯示多個右擊上下文菜單(或類似的東西),你可以在你的代碼實現一個簡單的檢查,以第一隱藏可見右擊上下文菜單顯示新的一個之前。

+0

是的,這也是我找到的解決方案。這並不完美,因爲您不能在Flash播放器之外「拖動」,但必須要等到Adobe解決問題。但是我會補充說,需要更多的邏輯來確保在每次RIGHT_MOUSE_DOWN事件之後只有1個RIGHT_MOUSE_UP事件被觸發,因爲用戶可以在不釋放鼠標按鈕的情況下重新進入播放器並釋放播放器內的右按鈕,同時觸發代理(離開時)和實際的RIGHT_MOUSE_UP事件。 – Godfather 2012-04-29 18:01:20