2012-04-29 27 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