はい、それはいくつかの変更で可能であるはずです。
イベントを処理する代わりに、元のターゲットに到達する前にイベントを停止し、クローンを作成して、遅延後にクローンを再起動することができます。
フラッシュのディスプレイリスト(表示されているもの)でイベントがどのように機能するかわからない場合は、最初に説明します。
ボタンをクリックすると、MouseEventが発生します。これは、リスナーが登録されたときに設定された優先度の順序で、「CLICK」イベントに登録されたすべてのイベントリスナーを呼び出すステージで開始するキャプチャフェーズから始まります。リスターナーが同じ優先度(デフォルトは0)の場合、ランダムな順序(適切には登録された順序)で呼び出されます。ステージのすべてのリスナーが呼び出されると、ボタンの祖先のリスト内の次のdisplayObjectが呼び出され、同じことが再び発生します。これは、マウスイベントを許可する最も内側のdisplayobject(ボタン内のテキストフィールドラベルの場合もあります)まで続きます。ここで、キャプチャフェーズが終了し、ターゲットフェーズが開始されます。最も内側のオブジェクトのすべてのリスナーは、ターゲットフェーズで呼び出されます。次に、バブリングフェーズが始まります。
フラッシュでは、ターゲットフェーズはバブリングフェーズの一部として処理されることに注意してください。
そして、これをどのように使用できますか?
登録してイベントリスナーを作成するときは、フェーズと優先度を指定します。デフォルトはバブリングフェーズと優先度0です。したがって、キャプチャフェーズのステージでクリックイベントリスナーを優先度int.MAX_VALUEで登録すると、おそらく別の同一のリスナーを除いて、他のリストの前にイベントを取得します。次のコードは、クリックイベントが他のリスナーによって登録されるのを防ぎます。
stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE);
function stageClick(e:MouseEvent):void
{
e.stopImmediatePropagation();
}
それは他のいくつかの問題を引き起こします、最初にあなたはすべてのためにそれをしたくありません。
- 1つの解決策は、イベントを変更する必要があるすべてのボタンのリストを作成し、e.targetでそれをチェックすることです。
- 別の解決策は、遅延を必要とするすべてのボタンにインターフェイスを実装させることです(これをIButtonDelayと呼びます)。次に、e.targetがIButtondelayであるかどうかを簡単に確認します。
- 3番目の解決策は、containg親(メニューバーなど)のイベントのみをリッスンすることです。これは、イベントがこの親に到達する前にイベントを使用する可能性が低いためです。
最初の2つのソリューションでは、検出を簡素化するために、ボタンの子に対するマウスの相互作用を防ぐ必要があります(DisplayObjectContainer.mouseChildren = false)。ここで何を選択しても、次に単純なタイマーで遅延する必要があります。そして、遅延後にイベントを再度発生させます。
e.target.dispatchEvent(e.clone());
それは、再起動されたイベントを遅らせないという問題を引き起こします。私の提案は、単純なクローンではなく、MouseEventから継承するイベントオブジェクトを起動することです。MouseEventはコピーが非常に簡単で、いくつかのプロパティしかありません。したがって、2回目にキャプチャするときに、通常のマウスクリックか複製かを確認できます。
ボタンに面があるソリューションを使用すると、次のようになります。
stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE);
function stageClick(e:MouseEvent):void
{
if(e.target is IDelayButton && !e is DelayedMouseEvent)
{
e.stopImmediatePropagation();
DelayEvent(e);
}
}
function DelayEvent(e:MouseEvent):void
{
//You code for the delaying, cloning and refiring the event here
}
より多くの種類のイベント(キーボードイベント)をリッスンする必要があるかもしれませんが、ほとんどのコードは、それらを含めるのに十分な汎用性を持たせることができます。
それがお役に立てば幸いです。