2

ムービー クリップがドラッグされたかクリックされたかを区別し、それに応じてさまざまな機能を実行できるようにしたいと考えています。問題は、startDrag が MOUSE_DOWN によって開始され、stopDrag が MOUSE_UP によって開始され、CLICK イベントが毎回トリガーされることです。私がやりたいのは、クリックイベントの条件で、「if drag == true { do something }」のようなことを言うことです

mouse_up または mouse_down 関数でフラグを設定できると考えましたが、問題は、マウスのクリックと同時に mouse_down が発生することです。実際の stopDrag() 関数などでフラグを設定できるようにする必要があります。タイムアウトの設定を含む解決策を見てきました-それは避けたいです。何か案は?

4

3 に答える 3

5

私が何度も対処しなければならなかった何か。

私がやっていることは、キャプチャフェーズで追加のCLICKリスナーを作成し(使用している他のものよりも優先度が高い)、そのハンドラーで、ドラッグであることがわかっている場合は、イベントの伝播を停止します。他のクリックハンドラーには到達しません。

したがって、あなたの場合、startDragを使用している場合(私は独自のカスタムドラッグルーチンを使用しています)、次のようなことを行うことができます。

function myFuntionThatStartsTheDrag() {
    myDragObject.startDrag();
    myDragObject.addEventListener(MouseEvent.CLICK,suppressClick,true,9999,true);
}

function suppressClick(e:MouseEvent):void {
    e.stopPropagation();
}

function myFunctionThatStopsTheDrag() {
    myDragObject.stopDrag();
    myDragObject.removeEventListener(MouseEvent.CLICK,suppressClick,true);
}
于 2012-08-16T19:53:17.070 に答える
1

ドラッグ開始時の x および y 位置とドラッグ終了時の x および y 位置を比較します。mouseUp の x と y の位置が mouseDown の x と y の位置に等しい場合、それがクリックであることがわかります。それ以外の場合はドラッグでした。非常に簡単な例:

var mouseDownX:int;
var mouseDownY:int;

var dragging:boolean;

//...

private function onMouseDown(event:MouseEvent):void {
    mouseDownX = stage.mouseX;
    mouseDownY = stage.mouseY;
    //...
}

private function onMouseUp(event:MouseEvent):void {
    if(mouseDownX == stage.mouseX && mouseDownY == stage.mouseY) {
        dragging = false;
    } else {
        dragging = true;
    }

    if(dragging) {
        //...
    }
}

このようにすると、クリックリスナーを削除でき、mouseUp ですべてを処理できます。

x と y が正確に等しくなくても数ピクセルずれている場合でも、mouseUp をクリックとして扱うために許容範囲を追加する必要がある場合があります (クリックは常にピクセルの上下に完全であるとは限らないため) が、上記のコードはほとんどの部分。

于 2012-08-16T19:53:53.247 に答える
0

dispatchEvent独自のカスタム リスナーを作成するために使用できます。

次のように使用します。

dispatchEvent(new Event("customEvent"));

そして、通常のイベントのように呼び出すことができます:

addEventListener("customEvent", eventFunction);
于 2012-08-16T19:51:12.800 に答える