2009-07-06 11 views
1

Flexコンポーネントが直接移動してxおよびyプロパティが変更されると、コンポーネントに「move」イベントが送出されます。それは大丈夫です。Flexでは、コンポーネントの移動をどのように検出できますか?

ただし、親コンポーネントが移動した結果、コンポーネントが移動することもあります。親移動などです。現在、親コンポーネントが移動すると、その子は、プロパティを変更せずに子孫に「移動」したり、子に送出されているイベントを移動したりするだけです。それでも、子供たちは画面上を動いています。では、このような一般化された動きをどうやって検出できますか?

答えて

1

つの回避策は、アプリケーション内のすべての移動イベントをキャプチャすることです:移動イベントがないバブルを行い、そしてその代わりに、捕獲されなければならないので、

Application.application.addEventListener 
    (MoveEvent.MOVE, handleMove, true, 0, true); 

第三引数が必要です。 4番目の引数は重要ではなく、5番目の引数は弱い参照を有効にします。この場合、Application.applicationからhandleMoveへのグローバル参照を作成しているため、メモリリークのレシピです。

もちろん、これはあまりにも頻繁に(アプリケーション内の何かが動くたびに1回)実行され、大きなアプリケーションではパフォーマンス上の問題が発生する可能性があります。階層内の上位コンポーネントがまだ存在することがわかっている場合は、リスナーをグローバルにではなくそのポイントに置くことができ、問題を軽減できます。

これを解決するには、よりクリーンな方法が必要です。

0

あなたはすでに最も一般的な解決策を提案していますが、子供が親/祖父母を通過するまで(固定された動的プロパティによって設定される)、少なくともこのどの親がどの子を扱うかを理解する上でいくつかの問題を軽減します。

private function addHandlerToStationaryParent(handler:function):void 
{ 
    var currentParent:DisplayObjectContainer = parent; 
    while(currentParent != null) 
    { 
     if(currentParent["stationary"] == true) 
     { 
      currentParent.addEventListener(MoveEvent.MOVE, handler); 
      return; 
     } 
    } 
} 

これがより良い解決策になるかどうかは、あなたの好みです。

+0

キャプチャを有効にするためにaddEventListenerの第3引数としてtrueを渡す必要があります。また、イベントリスナーを固定祖先の直下の子に追加する方が良いでしょう。そうしないと、固定祖先の無関係な子どもからイベントを受け取る危険があります。 –

+0

まあ、私はちょうどポイントを示していた。 – CookieOfFortune

関連する問題