Home > ActionScript 3.0 > AS3 MouseEventの挙動とmouseChildren

AS3 MouseEventの挙動とmouseChildren

久しぶりの更新になります。
ギリギリ月一回の更新は出来ている感じではありますが
もっともっとブログ更新頻度をあげないといけませんね

さて、今回の記事は AS3.0のMouseEventと mouseChildrenについてのお話です。


先ず今回の話を書くの経緯を話しますと
ボタンをプログラムベースで自作しようとした時に
ある現象に悩まされ,その解決策がmouseChildrenであった
ということが仕事であり、覚書しておいたほうが良いと思ったからです。


その現象とは、MyButtonというMovieClipを定義し
Up Over Press それぞれのリンケージシンボルをaddChildして
MyButtonにMouseEventのリスナを設定。
それに応じて各々のvisibleを変えて表示を切り替えると
CLICKイベントが取れないというものです

mouseChildren_image.png
こんな感じで実装するとイベントがとれなくなりました


まず結論からお話すると、この現象の原因は

MouseEventが、DisplayObjectの表示リストで
最も深い位置にあるノードをターゲットにして発生する。

という特徴を持っているために発生したものでした。

今回の実装はボタンの表示を切り替えを
MouseEvent.ROLL_OVER で Over のみ visible = true
MouseEvent.ROLL_OUT で Up のみ visible = true
MouseEvent.MOUSE_DOWN で Press のみ visible = true
という形で実装されているので
各ユーザアクション毎に表示リストの
最深ノードになるDisplayObjectが変わってしまうため
MouseEventの発生対象が変わってしまい
CLICKイベントが結果として発生しなかったようです。

どういうことかというと
CLICKはマウスボタンを押して離す動作なので
visibleの順序は、Up→Over→Press→Over となるわけですが
ボタンを押した時は、ターゲットは Over なのに対し
ボタンを離した時は、ターゲットが Press になってしまう
そのため、これはCLICKではないとなってしまったのしょう。
最初、このようなMouseEventの挙動に気がつかず
mouseEnabled を使っていろいろ試していたのですが
この事実を知り、子要素にイベントが通らなきゃいいんじゃん
ということになり、ためしにmouseChildren = false にしたところ
あっさりと解決してしました。

mouseChildren プロパティは自分の子要素に対して
マウスイベントを通過させるかどうかを設定するものです。
今まで使いどころがあまり無かったのですが
MouseEventの挙動を制御する際には非常に役立ちました。

ClickableなObject生成や、なにかボタンを作成する時は
こういったMouseEventの挙動と、mouseChildrenの設定は
覚えておくと良いと思います。


今日はこの辺で。
今月はもう1記事くらい書きたいなあ・・・

Comments:2

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

ipuheke 2009年2月26日 10:26

はじめまして。いつもFlashの勉強で拝読させていただいております。
僕もこの現象にずいぶんと悩まされて、「mouseChildren=false」で解決することに気付きましたが、MovieClipボタンなどでマウスイベントハンドラを実装する場合、ハンドラ内で

e.target(eはマウスイベント)

ではなく

e.currentTarget

と指定すれば、それが一番上のノードを取ってきてくれるので、mouseChildrenの設定も必要なく便利であることに最近気付きました。ので、是非とも一度お試しください!

kawakita@webmaster 2009年3月 4日 17:12

> ipuheke さま
コメントありがとうございます!

仰るとおり、ハンドラの e.currentTarget はイベントが発生しているノード
つまり、addEventListenerしているObjectへの参照が得られますが
今回の現象の解決にはならないかもしれません。

この問題はdispatchされたイベントオブジェクトの
target参照の問題ではなく
そもそもイベントが発生しないという問題だからです。

今回の現象の原因は、マウスイベントが
『ノードの最深層をターゲットに発生する』という部分で
MOUSE_DOWN時に最深層のターゲットのvisibleを切り替えると
MOUSE_UP時のイベントターゲットが変化してしまっているが故に
CLICKイベントが ”発生しない” というものです。
発生しない以上、イベントオブジェクトにはアクセスが出来ません・・・

e.currentTargetを使うとした場合は
MOUSE_DOWN と MOUSE_UP にリスナを登録し
DOWN と UP の e.currentTarget が等しい場合 CLICK とみなす
というように一つ上の階層で判断させる事は出来そうですね。

情報提供ありがとうございました。
また是非コメントしてください。相当喜びます。

ではでは!

Trackbacks:0

TrackBack URL for this entry
http://blog.flair4.jp/mt/mt-tb.cgi/43
Listed below are links to weblogs that reference
AS3 MouseEventの挙動とmouseChildren from flair4 blog

Home > ActionScript 3.0 > AS3 MouseEventの挙動とmouseChildren

Search
Feeds

Return to page top