AS3でのonReleaseOutsideの最も簡単な実装は?
-
05-07-2019 - |
質問
私は長年ActionScript 2を使用しており、現在はActionScript 3を使い始めています。私が欠けているのは、AS2のMovieClip.onReleaseOutsideの機能を簡単に複製できる方法です。ほとんどの場合、このイベントを実装する必要があります。そうしないと、フラッシュが起動しているときにマウスがダウンしていると思うなどの面白いバグが発生します。
AS2からAS3への移行ガイドに従って、私はこれには flash.display.InteractiveObject.setCapture()
を使用することになっていますが、私が知る限り存在しません。この文書は古くなっているか間違っていると思います。この機能を複製する方法について、ウェブ上でいくつかの投稿を見つけましたが、それらには独自の問題があります:
- このは、対応するonPressイベントがなくてもonReleaseOutsideをトリガーします。
- これは非常に効率が悪いようです。アプリ内の任意の場所でマウスをクリックするたびに、イベントリスナーを追加および削除します。
もっと簡単な方法が必要です。AdobeがActionscriptを書き換えるときにこれを忘れてしまったことを教えてくれませんか?
AS2コードの例:
// Assume myMC is a simple square or something on the stage
myMC.onPress = function() {
this._rotation = 45;
}
myMC.onRelease = myMC.onReleaseOutside = function() {
this._rotation = 0;
}
onReleaseOutsideハンドラーを使用せずに、squreを押し下げ、マウスをその外側にドラッグし、マウスを離した場合、四角形は回転しなくなり、スタックしたように見えます。
解決
シンプルで確実な:
button.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );
button.addEventListener( MouseEvent.MOUSE_UP, buttonMouseUpHandler ); // *
function mouseDownHandler( event : MouseEvent ) : void {
trace( "onPress" );
// this will catch the event anywhere
event.target.stage.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
}
function buttonMouseUpHandler( event : MouseEvent ) : void {
trace( "onRelease" );
// don't bubble up, which would trigger the mouse up on the stage
event.stopImmediatePropagation( );
}
function mouseUpHandler( event : MouseEvent ) : void {
trace( "onReleaseOutside" );
event.target.removeEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
}
onReleaseとonReleaseOutsideの違いを気にしない場合(ドラッグ可能なアイテムなど)、ボタン自体のマウスアップリスナーをスキップします(ここではアスタリスクでコメントします)。
他のヒント
root.addEventListener(MouseEvent.UP、onMouseReleaseOutside);
もちろん、onMouseReleaseOutsideを定義します。基本的に、ボタン(またはmc)の外側で発生するMouseEvent.UP(マウスリリース)は、ボタンではなくステージにヒットします。これは私が通常捕まえる方法です。
このイベントを見ましたか:
flash.events.Event.MOUSE_LEAVE
ドキュメントから:
マウスポインターがステージ領域から出ると、Stageオブジェクトによって送出されます。
Event.MOUSE_LEAVE定数は、mouseLeaveイベントオブジェクトのtypeプロパティの値を定義します。
特定のMovieClipのすぐ外ではなく、ユーザーがマウスをステージから離すかどうかだけに関心がある場合に問題を解決します。