- 2009年2月22日 21:05
- ActionScript 3.0
ギリギリ月一回の更新は出来ている感じではありますが
もっともっとブログ更新頻度をあげないといけませんね
さて、今回の記事は AS3.0のMouseEventと mouseChildrenについてのお話です。
先ず今回の話を書くの経緯を話しますと
ボタンをプログラムベースで自作しようとした時に
ある現象に悩まされ,その解決策がmouseChildrenであった
ということが仕事であり、覚書しておいたほうが良いと思ったからです。
その現象とは、MyButtonというMovieClipを定義し
Up Over Press それぞれのリンケージシンボルをaddChildして
MyButtonにMouseEventのリスナを設定。
それに応じて各々のvisibleを変えて表示を切り替えると
CLICKイベントが取れないというものです

こんな感じで実装するとイベントがとれなくなりました
まず結論からお話すると、この現象の原因は
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記事くらい書きたいなあ・・・
- Newer: Flashが何故かうまく動かない時に疑うべき8つの要素
- Older: あけましておめでとうございます