2009-03-17 11 views
0

誰かがイベントにフックする経験はありますか? ですから、動作を変更せずに動作を変更することができます。AS3、あなたのイベントをフックする

したがって、特定のメニューボタンのクリックごとの動作を変更したい場合、クリックすると元のコールバックが呼び出されるまでに30秒待つことになります。

私は、既存のAirアプリケーションの上にレイヤーを作成するプロジェクトに取り組んでいます。このレイヤーでは、マイクロ支払いによって特定の機能に完全にアクセスできるように管理することができます。

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

答えて

3

はい、修正が必要です。

イベントを無効にするのではなく、元のターゲットに到達する前にイベントを停止し、複製して遅延の後にクローンをリフレッシュすることができます。

イベントが表示リスト(どのように表示されているか)でどのように動作しているかわからない場合は、まずそれを説明してください。

ボタンをクリックすると、MouseEventが開始されます。このイベントは、「CLICK」イベントに登録されているすべてのイベントリスナーを、リスナーが登録されたときに設定された優先順位の順に呼び出すステージから開始されます。 listernersの優先度が同じであれば(デフォルトは0)、ランダムな順番で呼び出されます(登録されている順番通りです)。 ステージのすべてのリスナーが、祖先が呼び出されたボタンのリスト内の次のdisplayObjectと呼ばれると、同じことが再び発生します。 これは、マウスイベント(ボタン内のテキストフィールドラベルである可能性があります)を可能にするほとんどのdisplayオブジェクトの中まで、すべてを続けます。 ここで、キャプチャフェーズが終了し、ターゲットフェーズが開始されます。 最も内側のオブジェクトのすべてのリスナーがターゲットフェーズで呼び出されます。 その後、泡立つ段階が始まります。ここでは、前と同じ方法で親と祖父母のすべての池がステージまで呼び出されます(内側から)。

フラッシュでは、ターゲットフェーズがバブリングフェーズの一部として処理されることに注意してください。

これはどのように使用できますか?

よく登録すると、イベントリスナーでフェーズと優先度を指定します。デフォルトでは、バブリングフェーズと優先度0が設定されています。キャプチャフェーズのステージにclickイベントリスナーを優先int.MAX_VALUEで登録すると、別のリスナーの前にイベントが発生します。 次のコードは、他のリスナーによってクリックイベントが登録されないようにします。

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE); 

function stageClick(e:MouseEvent):void 
{ 
    e.stopImmediatePropagation(); 
} 

これは、いくつかの他の問題を引き起こします。まず、すべてのことをしたくないということです。

  • 一つの解決策は、 そのイベントが変更されている必要があり、すべてのボタンの リストを持っていること、およびe.targetでそれに対して をチェックすることになります。
  • もう1つの解決策は、 遅延を必要とするボタンをすべて持つことです。 は、インターフェイスを実装します( IButtonDelayと呼ぶことができます)。そして、e.targetがIButtondelayの場合は、簡単なチェック をチェックします。
  • 第三の溶液は、それはとにかく、この親に達する前にイベント を使用すること はほとんどありませんから、(メニューバーのような)containg 親のイベントをリッスンのみ になります。

最初の2つの解決策では、検出を簡略化するためにボタンの子のマウス操作を防止する必要があります(DisplayObjectContainer.mouseChildren = false)。 ここで選択したものが何であれ、次に簡単なタイマーで遅らせる必要があります。遅れてからイベントを再開してください。

e.target.dispatchEvent(e.clone()); 

これは、refiredイベントを遅延させないという問題を提起します。代わりに、単純なクローンの代わりにMouseEventから継承したイベントオブジェクトを起動することをお勧めします。 MouseEventは非常に簡単にコピーできますが、いくつかのプロパティしかありません。だから、それをキャプチャするときに、それが正常なマウスクリックか重複しているかどうかを確認することができます。あなたがイベントのより多くの種類(キーボードイベント)をリッスンする必要があるかもしれませんが、コードのほとんどを行うことができる

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 
} 

:ボタンのinfaceの溶液を使用し

、それはようなものになるだろうそれらを含めるのに十分な汎用性。

長い読書を助け、ごめんなさい。

+0

非常に良い答えです! –

+0

あなたの歓迎、幸せなコーディング。 –

0

私はあなたがこれを行うことができると思う:clickイベントのイベントハンドラを使用してTimerを使用する限りOR呼び出しに何らかの処理を行い、後者の処理が完了したら、clickに対応するアクションを呼び出します。

または、紛失しているものがありますか?

2

実際にアプリケーションを変更せずにイベントシステムを変更することはできません(アプリケーションを変更することができれば、この動作を可能にするカスタムボタンを作るのは難しいです)

最も簡単な解決策は、おそらくブロックしたいボタンの上に別のスプライト/ボタンを追加することです。このように、アプリケーションをあまり変更する必要はなく、ブロッキングが簡単です。欠点のみ:元のボタンでのマウスオーバー動作は、マウスイベントが発生しないため動作しません。

関連する問題