0

誰かがイベントにフックした経験がありますか?そのため、初期の動作を変更せずに動作を変更できます。

たとえば、特定のメニューボタンのセットをクリックするたびに動作を変更して、クリックすると元のコールバックが呼び出されるまで30秒待つとしましょう。

私は、既存のAirアプリケーションの上にレイヤーを作成するプロジェクトに取り組んでいます。これにより、特定の機能へのフルアクセスを可能にするマイクロペイメントを可能にする方法で管理を構築できるようになります。

そして、私の推測では、イベントをキャプチャするためにフックを使用することでした。そのため、アプリケーションを編集する必要はなく、拡張するだけです。(私が間違っている場合は私を訂正してください:-))私は

4

3 に答える 3

3

はい、それはいくつかの変更で可能であるはずです。

イベントを処理する代わりに、元のターゲットに到達する前にイベントを停止し、クローンを作成して、遅延後にクローンを再起動することができます。

フラッシュのディスプレイリスト(表示されているもの)でイベントがどのように機能するかわからない場合は、最初に説明します。

ボタンをクリックすると、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
}

より多くの種類のイベント(キーボードイベント)をリッスンする必要があるかもしれませんが、ほとんどのコードは、それらを含めるのに十分な汎用性を持たせることができます。

それがお役に立てば幸いです。

于 2009-03-23T17:37:33.420 に答える
2

実際にアプリケーションを変更せずに、そのような方法でイベント システムを変更できるとは思いません (アプリケーションを変更できる場合、この動作を可能にするカスタム ボタンを作成することはそれほど難しくありません)。

最も簡単な解決策は、おそらく、ブロックしたいボタンの上に別のスプライト/ボタンを追加することです。この方法では、アプリケーションをそれほど変更する必要がなく、ブロックが簡単です。唯一の欠点: 元のボタンのマウスオーバー動作は、マウス イベントを取得しないため機能しません。

于 2009-03-17T11:10:43.447 に答える
0

Off the top of my head, I think you can do this: Use an event handler for the click event and use a Timer to wait for as long as you want OR call do some processing and then on completion of the latter, call the action corresponding to the click.

Or, is there something I am missing?

于 2009-03-17T11:04:20.357 に答える