SimpleButton.enabled(1)
2009/02/06 23:57 - AS3.0
何て使えないプロパティなんだ enebled!
そう考えた時期が私にもありました。てゆーか今も。
先だって Mediator パターンのサンプルを作っていたときです。
シンプルボタンを継承した Button クラスを作ったんですが、ボタン機能を一時的に無効にしたいという要求があったのです。
最初は enebled プロパティのスイッチングで大丈夫だろうと思っていました。
マウスカーソルは指から矢印になるし、マウスオーバーやマウスダウンで表示が切り替わらない、オッケーオッケーこれでよし、と思っていたらとんでもない伏兵が!
マウスイベントリスナーが生きたままなんです、enebled を false にしても。 なんでやねん。
このときに作りたかったのは、一度クリックされたボタンは他のボタンが押されるまで無効になる、というものです。
しかし上記サンプルを試していただくと分かるとおり、一度ボタンを押すとマウスカーソルは矢印になるので、一見ボタンとしては機能しなくなったように見えますが、実はイベントは機能し続けます。
enabled 使えねーじゃん、と、仕方ないのでそのときは関数を作って対処しました。 enebled = false と removeAddEventListener、enabled = true と addEventListener をペアにして切り替えるように。 そして一度押すと、色が青くなるようにもして、他の生きているボタンと色で区別できるようにもしました。
でもさぁ enabled って名前なんだからボタン機能の有効無効を切り替えるプロパティなんだろ? なんでイベントリスナーが無効にならないんだよ、ボタン殺したらイベントも死ぬのが、当然期待される挙動だろーが、と全くもって釈然としなかったのですが、昨日 _level0.KAYAC のナックルさんのエントリーを読んでその謎が解けた!
本当の意味でボタンを無効にしたい場合は enabled ではなく InteractiveObject 由来の mouseEnabled を使わなければならなかったんですね。
mouseEnebled なんてプロパティ初めて知りましたよ。 やっぱ言語リファレンスはちゃんと読まんとイカンね。
ボタンが有効であるか無効であるかを指定するブール値
注意:ボタンの mouseClick が発生しないようにするには、enabled プロパティおよび mouseEnabled プロパティを false に設定
このオブジェクトがマウスメッセージを受け取るかどうかを指定
ライブヘルプの SimpleButton と InteractiveObject のページにはそれぞれ上記のように書いてあります。
ところで繰り返しますが、ボタン無効化によって期待される挙動は以下の三つです。
- ボタンの表示オブジェクトがマウスオーバーなどでも切り替わらなくなる
- マウスカーソルが指から矢印になる
- イベントリスナーが無効になる
ライブヘルプの説明文からみると、1. と 2. の制御はenebled = false で、3. の制御は mouseEnabled = false でと考えてしまうのですが、mouseEnabled は enabled を包含します。 つまり mouseEnabled を false にするだけでオッケー。
それを確認するのが以下のサンプル。 enabled の true、false と mouseEnabled の true、false の組み合わせでボタンを4つ生成し、それぞれがどのような挙動をするか比較したものです。 trace を使っているので swf は提示しません。
まぁ考えてみれば、mouseEnabled はマウスイベントの有効無効を制御するプロパティ。 ボタンのオーバーやダウンによる表示オブジェクトの切り替わりってのは、マウスイベントで実現されているわけであるからして、上記の期待する挙動の 1. は mouseEnabled に包含されて当然というわけですね。
マウスカーソルの切り替わりが何で mouseEnabled で制御されるのか意味不明だけど、これもマウスイベント絡みなのかなぁ。
いずれにしてもボタンを完全に無効化したいなら enabled なんかシカトして mouseEnabled だけを見ていれば良い、ということが分かりました。
またひとつ知恵がついた。
続く。