2011-08-15 12 views
1

私はFlash CS5で小さなアプリケーションを構築していますが、問題が発生しました。私は、デザイナーが作成したかなり複雑なAdobe Illustratorファイルを自分のアプリケーションにインポートしました。このファイルは、Flash内で操作できるあらゆる種類の画像、テキスト、その他のコンポーネントでいっぱいです。FlashのMovieClip MOUSE_OVERの問題

私のアプリケーションには、その上にテキストのある基本的な四角形を含むグループがあります。ユーザーがマウスオーバーしてツールチップを表示するホットスポットを作りたいと思っています。このグループ全体をMovieClipに変換しました。これにより、ツールチップがMOUSE_OVERに表示されます。その唯一の厄介な点は、ユーザーがそれをトリガーするときです。

何らかの理由で、私がムービークリップの異なる領域にポインタを移動するたびに、MOUSE_OVERイベントが何回か呼び出されます。たとえば、背景の上にマウスを置くと1回だけ焼き付けられ、テキストのさまざまな領域にマウスを移動すると、これらのコンポーネントはすべて1つのMovieClip内でグループ化されていますが、何回か起動されます。

これらのオブジェクトを1つのMovieClipとして動作させると、MovieClipのどの領域にマウスを置くとMOUSE_OVERイベントリスナーが1回だけ起動されますか?

答えて

0

問題は、各アイテムによってMOUSE_OVERが起動されていることです。これはそれぞれがそのイベントをネイティブに起動し、イベントがすべてバブルすることが予想されます。イベントのバブルを見て、それをもっと見つけてください。

この問題を回避する方法はいくつかあります。

  1. はフォアグラウンドクリップを作成し、代わりにそれに耳を傾けます。これは私の意見では、はるかに良い選択肢です。
  2. useCaptureパラメータを使用して、私の経験上、これらの問題の多くを解決できます。 addEventListener(name, callback)の代わりにaddEventListener(name, callback, true)と呼ぶでしょう。 removeEventListenerについても同様です。
  3. 手動イベントトラッキング!最後の手段の武器で、これは最悪のパフォーマンスと最大の頭痛を犠牲にして、最も信頼性の高いものです。これには、多かれ少なかれグローバルなイベントリスナーとヒットテストが必要です。必死ならば使います。
+0

を使用することができます!あなたの洞察に感謝します! +1と答えが受け入れられました! –

+0

@Spryno私はそれが望むことを望んでいた - 私は絶望的な場合、私はそこから移動します。 – cwallenpoole

+0

申し訳ありませんが、-1にする必要があります。これらの提案は、中級から上級のプログラマーのレパートリーに効果的かつ有用であるが、この文脈では不必要なハックであり、私の意見では、Flash Platformの基本の一部の理解が不十分であることを促進する。このページの他の提案(ROLL_OVERやmouseChildren = falseなど)は、この非常に簡単なケースを処理するために、プラットフォームにすでに組み込まれているオプションです。 – merv

2

実際にはROLL_OVERを使用して、前景クリップを必要とせずに同じことを行うことができます。アイテムを既にMovieClipにグループ化している場合は、単にMouseEvent.ROLL_OVERのリスナーを追加します。あなたが好きなように機能するだけでなく、余分なフォアグラウンドクリップからの混乱を少なくすることができるので、私は個人的に可能な限りクリーンなコードを常に好みます。

movieclip.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler); 

function onRollOverHandler(e:MouseEvent):void 
{ 
    // this will run once when you move your mouse over the movieclip 
} 

次に、マウスがMovieClipから移動したときにこの機能の反対にするだけです。

movieclip.addEventListener(MouseEvent.ROLL_OUT, onRollOutHandler); 

function onRollOutHandler(e:MouseEvent):void 
{ 
    // this will run once when you move your mouse off of the movieclip 
} 
0

これは、イベントのバブリングによって発生します。私はこれを防ぐためにカスタムMOUSE_OVERイベントのファンです。

1

あなたのMovieClip内のオブジェクトをアクティブにする必要がない場合は、私がアイデア#1を使用し、それが完璧に動作

yourMC.mouseChildren=false; 
yourMC.addEventListener(MouseEvent.MOUSE_OVER,yourOverHandlerFunction); 
関連する問題