SimpleButton.enabled(2)
2009/02/07 20:22 - AS3.0
前回からの続き。
しかしどうも釈然とせぬ。何って enabled の仕様ですよ。
だいたいボタンにマウスイベントリスナーは必須でしょう、常識的に考えて。 イベントリスナーなしのボタンなんてボタンとして存在する意味がないと思いませんか? ボタンの有効無効を制御するプロパティだなぞと言いつつ、イベントリスナーの有効無効を制御できないなんてナンセンス。
そこまで考えてハタと気づきました。 もしかして enebled プロパティはデフォルトのまま使ってはいけないのではないかと。
まず enabled = false にしたときの SimpleButton の挙動を再確認すると、以下の二つになります。
- マウスカーソルが指から矢印になる
- 表示オブジェクトが常に upState に指定したものになる
1. は何の問題もないんですが、2. はちょっと力不足の感が否めません。
前回の最初のサンプルを再掲します。
このボタンは upState と hitTestState に赤い正方形、overState に緑の正方形、downState に青い正方形を割り当てています。
というこは他のボタンが押されるまで、一度押されたボタンは常に赤い正方形で表示されるわけですが、でもそれって不便じゃないですか?
いずれのボタンの上にもマウスカーソルがない場合、生きているボタンと死んでいるボタンの区別がつきません。
ユーザビリティ的には無効中のボタンは、たとえばボタンの色が薄くなるとか、停止中という表示がされるとか、ボタンの表示オブジェクトのレベルで、生きているボタンとは明らかに違う見栄えにするのが作り手の良心というか義務というもの。 enebled = false のときは upState とは違う見栄えであるべきではないかと考える次第。
となると enabled の存在理由には最初から問題ありなのでは?
ここで再びライブヘルプの enabled の説明文を見てみましょう。
ボタンが有効であるか無効であるかを指定するブール値
注意:ボタンの mouseClick が発生しないようにするには、enabled プロパティおよび mouseEnabled プロパティを false に設定
「注意」として enebled と mouseEmabled 両方 false にしないとダメだと書いてありますが、mouseEmable = false なら enabled = true でもボタンは事実上死んでいることは前回の最後のサンプルで確認しました。 つまり別に両方 false にしなくてもよいということです。
この点からも enabled というプロパティの存在意義って果たして何なのかという疑問がさらに増します。
ということはもしかして、enabled というプロパティはプログラマがオーバーライドすることを前提としたプロパティなのではないか、カスタムイベントの clone メソッドとか、「そうめん」の run メソッドとかと同じように。
で、そんな妄想に則ってコーディングしたのが下のサンプル。
前回二番目に掲示した、関数を使ったサンプルと見かけは全く同じですが、ボタンの有効無効を切り替える過程が異なります。
前回の Button クラスは enebleButton というメソッドを作り、そのメソッドで有効無効を切り替えていましたが、今回の Button クラスは enabled のゲッターとセッターを下記のようにオーバーライドしています。
どうせ、enabled の機能は mouseEmebled が完全にフォローしているんだから、いっそのことオリジナルの enabled は殺してプログラマがやりたいようにオーバーライドすればいいんじゃなかろうか、というのが私の意見であります。
まぁオリジナルの enabled を殺したことによる副作用が出てきそうな気もしないでもないがな。