AqLetter 改
2007/09/11 21:59 - AS3.0
AqLetter クラスの意義はテキストフィールドとテキストフォーマットを組みにして管理するということです。
今まで使っていた AqLetter は Sprite を継承したクラスとして設計していました。
Sprite を継承したためディスプレイオブジェクトの性質を備えた自分自身に、テキストフィールドを子オブジェクトとして addChild し、テキストフォーマットをクラスプロパティとして管理、随時、テキストフィールドとテキストフォーマットにアクセスするという設計をしていました 。
でもちょっと考えたら分かることですが、テキストフィールドはディスプレイオブジェクトなんだから、何もわざわざ Sprite に addChild するなんて、余計な入れ子構造にする必然性は全然ないんですよね。
ただ、そのときは TextField のサブクラスで設計すると、ちょっと扱いがやっかいになる点がひとつありました。
まあ LiveDocs をちゃんと読んでいれば何の問題もないことだったんですが。
やっかいな点というのは TextField.text を変更したときに適用済みの FextFormat がクリアされてしまうことに起因します。
(1) TextField.text = "何らかの文字"; (2) TextField.setTextFormat( TextFormat );
上記(1)でテキストフィールド内の文字列を変更するというのは、皆さんご存じのとおりです。
そして(1)の処理をおこなうとテキストフォーマットがクリアされてしまうので、(2)のように改めてテキストフォーマットを適用しなおさなければならないということも、ご存じのことと思います。
AqLetter クラスは TextField クラスの延長として扱えるととても分かりやすいです。
なので AqLetter.text や AqLetter.textWidth といった記法で、AqLetter クラス内のテキストフィールドのプロパティを扱えるようにしたいと思っていました。
しかし AqLetter をTextField のサブクラスとして設計すると、AqLetter.text という記法で上記(1)(2)を同時に処理できるようなコードは書けません。
試行錯誤中に実験的に作った AqLetter extends TextFiled では、仕方なく resetText という以下のようなパブリックメソッドで誤魔化してみたりもしました。
public function resetText( text:String ):void { this.text = text; if ( fmt != null ) { this.setTextFormat( fmt ); } }
でもこれってスマートじゃないし、AqLetter.text = "xxx" ではなく AqLetter.resetText( "xxx" ) と書かなくてはいけないとなると直感的じゃない。
どうしたもんだべ、と思っていたときに知ったのが TextField.defaultTextFormat というプロパティ。
LiveDocs によると ActionScript 3.0 で採用されたプロパティとのこと。
うわ。こんなステキなプロパティがあったなんて。
リファレンスはちゃんと読まなあきまへんな。
おかげで、AqLetter extends TextFiled を作ることができ、AqLetter extends Sprite で設定していた setter と getter も不要になりました。
あと、この際なのでテキストフィールドのプロパティとテキストフォーマットのプロパティの規定値をクラス内に持つように改造しました。
その新しい AqLetter を使って作ったのが下のサンプルです。
白い領域をクリックすると文字列が循環的に変更されます。 赤、青、黒の部分をクリックすると、テキストフォーマットを変更します。
- ソース (9.02 KB)
これで AqLetter がかなり分かりやすくなりました。