2011-07-14 5 views
2

を含まない2つのMouseEvent.MOUSE_DOWNをFlashアプリケーションが受信できる状況はありますか?すべてのMOUSE_DOWNはMOUSE_UPを保証されていますか?

私のActionScript 3アプリケーションでは、スプライトをドラッグしたユーザーを追跡したいと思います。私の計画は、MouseEvent.MOUSE_DOWNを聞き、マウスの位置を記録する無期限に繰り返すタイマーを開始し、タイマーをMouseEvent.MOUSE_UPで停止することです。それは良い計画ですか?

答えて

2

はい、ステージを聴いていない限り、マウスがFlashムービーの外に出た場合、mouseupイベントを逃すことができます。しかし、何も実験を打つことはありません。

2

私は常にカスタムドラッグに使用するコードを見つけることができます。通常、正常に動作するはずです。スプライトの位置を変更して追跡するためのMOUSE_MOVEイベントを再生しますが、代わりにEvent.ENTER_FRAMEイベントを使用するか、代わりにタイマーを使用できます。

ObjectToDrag.addEventListener(MouseEvent.MOUSE_DOWN, startCustomDrag); 

public function startCustomDrag(e:MouseEvent):void 
{ 
    _prevX= e.stageX; 
    _prevY= e.stageY; 

    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); //REPLACE BY TIMER OR Event.ENTER_FRAME 
    stage.addEventListener(MouseEvent.MOUSE_UP, stopCustomDrag); 
} 

private function dragObject(e:MouseEvent):void 
{ 
    ObjectToDrag.x += _prevX - e.stageX; //OR ANY OTHER CALCULATION 
    ObjectToDrag.y += _prevY - e.stageY; //OR ANY OTHER CALCULATION 

    _prevX= e.stageX; 
    _prevY= e.stageY; 
} 

public function stopCustomDrag(e:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject); //REPLACE BY TIMER OR Event.ENTER_FRAME 
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopCustomDrag); 
} 
5
  • クリックが、ボタンを離しません。
  • ボタンを押したままカーソルを外側に移動します。
  • ボタンを外側に放します。
  • 戻ってもう一度クリックしてください。

アップイベントなしで2つのダウンイベントが発生します。

ドラッグアンドドロップのよりよい解決策は、MOUSE_MOVEイベントとイベントハンドラチェックのbuttonDownプロパティを聞くことです。移動中にボタンが押されている場合はtrue、そうでない場合はfalseです。

EDIT:フラッシュウィンドウの外にボタンを放してもステージの場合、アップイベントが発生します。だから、この段階では動作しますが、MOUSE_MOVEbuttonDownを使用しているタイマーの代わりに、私にはうまく見えます。あなたは以下のコードを自分でチェックすることができます。

public class StageEventTest extends Sprite 
{ 
    public function StageEventTest() 
    { 
     stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown); 
     stage.addEventListener(MouseEvent.MOUSE_UP, onUp); 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove); 
    } 

    private function onDown(evt:MouseEvent):void { 
     trace("down"); 
    } 

    private function onUp(evt:MouseEvent):void { 
     trace("up"); 
    } 

    private function onMove(evt:MouseEvent):void { 
     trace("move", evt.buttonDown); 
    } 
} 
+0

ありがとうございました。 MOUSE_UPを外部から送信する動作が 'ステージ'に固有のものであることはわかりませんでした。 – Tim

+0

イベントリスナを 'stage'に追加すると、この問題が緩和されると思います。 'MOUSE_UP'を聞いて私の解決策は動作しますか? – Tim

+0

通常の表示オブジェクトで確認しました。ステージで確認する必要があります。 – taskinoor

4

それはマウスがステージの外にある場合、イベントをマウスを欠場し、ステージの上にマウスを置いたときに、マウスアップイベントが呼び出されることはなかったので、それがマウストラッキングだまいります。この可能性のある問題は、Event.MOUSE_LEAVEを使用することで緩和できます。マウスの離脱イベントをマウスのアップイベントハンドラに転送すると、ユーザーがマウスをステージから離してマウスアップイベントが呼び出されるようになります。

関連する問題