0

ほとんどの場合にうまく機能するカスタマイズされたドラッグ イベントがあります。

stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );

function beginDrag( e:MouseEvent )
{
  stage.addEventListener( MouseEvent.MOUSE_MOVE, drag );
  stage.addEventListener( MouseEvent.MOUSE_UP, endDrag );
  stage.addEventListener( MouseEvent.DEACTIVATE, endDrag );
  stage.addEventListener( Event.MOUSE_LEAVE, endDrag );
  stage.addEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );

  //trigger beginDrag event
}
function drag( e:MouseEvent )
{
  //trigger drag event
}
function endDrag( e:Event )
{
  stage.removeEventListener( MouseEvent.MOUSE_MOVE, drag );
  stage.removeEventListener( MouseEvent.MOUSE_UP, endDrag );
  stage.removeEventListener( MouseEvent.DEACTIVATE, endDrag );
  stage.removeEventListener( Event.MOUSE_LEAVE, endDrag );
  stage.removeEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );

  //trigger endDrag event
}

問題は、このコードを使用すると、wmode=transparentまたはステージ外でイベントが発生したときにイベントがwmode=opaque検出MOUSE_LEAVEされないことです。MOUSE_UP

MOUSE_LEAVEまたは のときにイベントを検出する方法はありwmodeますtransparentopaque?

また

回避策を実装できるようにwmode設定されていることを検出する方法はありますtransparentか?opaque

4

1 に答える 1

0

デフォルトでは、MOUSE_LEAVE は信頼できるイベントではありません。解雇されることもあれば、解雇されないこともあります。これに関する苦情は、ウェブ全体で見つけることができます。

ただし、できることが 1 つあります。それは、マウスがステージ上にあるかどうかを手動で確認することです。

var out : Boolean = false;

stage.addEventListener (Event.ENTER_FRAME, checkMouse);

function checkMouse (ev:Event) : void {
    if (
        stage.mouseX < 0 || 
        stage.mouseX > stage.stageWidth || 
        stage.mouseY < 0 || 
        stage.mouseY > stage.stageHeight) 
    {
        if (!out) 
        {
            out = true;
            stage.dispatchEvent (new Event(Event.MOUSE_LEAVE));
        }
    } 
    else if (out) 
    {
        out = false;
        stage.dispatchEvent (new Event("mouseEnter"));
    }
}

これにより、カーソルがステージ領域の外にある場合は MOUSE_LEAVE イベントが送出され、再入した場合はカスタムの「mouseEnter」イベントが送出されます。その後、これらのイベントに確実に反応するようにイベント リスナーをステージに追加できますが、一度に複数の MOUSE_LEAVE が発生する可能性があることに注意する必要があります (カスタム リスナーと組み込みの両方が実行された場合)。変数をチェックしてout、イベント ハンドラーの二重実行を防ぐことができます。

PS これがすべての stage.align および stage.scaleMode オプションで機能するかどうかはわかりません。これは、StageScaleMode.NO_SCALE と StageAlign.TOP_LEFT の組み合わせで機能するはずです。その他の設定については、チェックして回避策を見つける必要があります。

于 2011-03-26T16:20:27.820 に答える