2010-12-06 13 views
1

簡略化されたコード:どのflashイベントがmouse_upイベントを中断でき、どのように検出するのですか?

//triggered on MouseEvent.MOUSE_DOWN 
private function beginDrag(e:MouseEvent):void 
{ 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.addEventListener(Event.DEACTIVATE, endDrag); 
    contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag); 
} 

private function drag(e:MouseEvent):void 
{ 
    //do stuff 
} 

private function endDrag(e:Event):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.removeEventListener(Event.DEACTIVATE, endDrag); 
    contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag); 
} 

私は私のフラッシュコード内のいくつかのクリックアンドドラッグ技術を使用しています、と私はMOUSE_UPイベントといくつかの抜け穴気づいた:それは文句を言わないトリガされ

  • をマウスがまだ押されている間にコンテキストメニューがアクティブになっている場合ウィンドウが非アクティブ化されている場合、それがトリガされ文句を言わない
  • (Alt + Tabキーまたは類似の)

私の質問は: おそらくMOUSE_UPイベントを中断し、予期しない動作につながることができ、他にどのようなイベント?

さらに、コンテキストメニューにリスナーを手動で追加/削除することなく、すべてコンテキストメニューのContextMenuEvent.MENU_SELECTを一般的にキャッチする方法はありますか?

+0

どのようにドラッグしていますか?ドラッグ可能なオブジェクトをマウスでのみ移動する必要がありますか、または左のbtnを押したまま移動するとカーソルの後ろに移動しますか? imhoはほとんどの場合、 'event.buttonDown'チェック付きの' MouseEvent.MOUSE_MOVE'リスナーがベストプラクティスであるので、私は尋ねています – www0z0k

+0

@ www0z0k明らかにあなたは私のコードを読んでいませんでした。もしできれば、私はあなたにコメントを-1与えるだろう。私はすでにドラッグの基本を持っています**問題ではありません**問題は、 'MOUSE_UP'イベントがフラッシュによって捕らえられないようないくつかの無関係なイベントが発生したときです。 – zzzzBov

+0

答えを投稿することをお勧めします;) 'Event.MOUSE_LEAVE'は、コンテキストメニューが呼び出されたとき、左のbtnが解放されたとき、またはマウスがステージを離れたときにbtnが解放されたときに送出されます。 – www0z0k

答えて

0

に適合しない場合、それは場合に発生するEvent.REMOVED_FROM_STAGEまたはEvent.REMOVEDイベントのために可能であることは、コードをアップグレードすることは非常に歓迎されている/* */
でunnesesaryすべてをコメントアウトコンパイルされたswfは別のswfの子です。私はそのシナリオを信じて、所有する文書の段階を参照し、それでも問題はない。 後、ユーザーがMouseEvent.MOUSE_UPイベントをトリガーするマウス、を手放すまで、

FocusEvent.FOCUS_OUT

はトリガされません。

私の元のコードがうまく機能しているようです。 (サブ要素のコンテキストメニューがトリガされた場合、抜け落ちる可能性があります)。

1

this code might help
私はあなたはそれがあなたの状況

+0

@ www0z0kコードは**私が既に使っているものより**悪い**働いています。ステージ上で左ボタンを押したままマウスの右ボタンをクリックすると、コンテキストメニューがポップアップし、コンテキストメニューがキャンセルされます(ステージの外側をクリックすると)、青いオブジェクトは引き続きマウスに接続されますマウスの左ボタンを押さなくなりました。私が直面している問題の特定のタイプです。 – zzzzBov

+0

@zzzzBovは現在それを修正しようとしています。私のコードで何か間違っていますか? – www0z0k

+0

@zzzzBovはいくつかのイベントで自分のコードを更新しました。 – www0z0k

-1

MOUSE_LEAVEの大きな問題があります:あなたがダウンして開催されたマウスを使用しているならば、MOUSE_LEAVEis not fired.

これは私がドラッグ中にMOUSE_LEAVEをシミュレートするために行うものです。幸いにも、stage.mouseXstage.mouseYは、マウスがまだダウンしている間に更新されます。特定のブラウザではおそらくMOUSE_LEAVEが必要です。

public function beginDrag(evt:MouseEvent):void 
    { 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
     stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
     stage.addEventListener(Event.DEACTIVATE, endDrag); 
     stage.addEventListener(Event.MOUSE_LEAVE, endDrag); 

     _dragging = true; 
    } 

    public function drag(evt:MouseEvent):void 
    {   
     // check if mouse has fallen off stage 
     if (stage.mouseX < 0 || 
      stage.mouseY < 0 || 
      stage.mouseX > stage.stageWidth || 
      stage.mouseY > stage.stageHeight) 
     { 
      endDrag(evt); 
      ExternalInterface.call("alert", "Dropped off"); 
      return; 
     } 

     // do drag stuff here... 
    } 
+0

あなたは明らかに 'MOUSE_LEAVE'の目的を誤解しています。ユーザーがマウスを押し続けている場合、mouse_moveイベントは一般的に(wmodeが不透明または透明の場合に問題があります)、マウスがステージ上に移動しなくてもドラッグを続けることができます。私の質問は、特に 'MOUSE_UP'イベントを中断し、' MOUSE_LEAVE'について* not *であることでした。 – zzzzBov

+0

@zzzzBov - あなたの質問に間違いがあるとは思わない;-)私はMOUSE_LEAVEについて真実だと思う。 –

+0

マウスを押してステージを離れるときに 'MOUSE_LEAVE'が*発射されないように設計されている。マウスが離されると起動します(一部のブラウザではwmodeエラーは例外です)。 'MOUSE_OUT'代替物として設計されていません。 'MouseEvent'ではないことに注意してください。 – zzzzBov

関連する問題