「表示する文字列の幅に合わせて下のオブジェクトの幅を可変にしたい」という希望はまあまあよくあると思うんだけど、文字列の幅取得ってどうやるの?と行き詰った。
最初は
- lengthで文字数を取得
- 一文字の幅を適当に決めて、固定の幅×文字数 で指定する
とかやってたんだけど、そうすると半角と全角で数が合わない。「半角を1/全角を2」とかしても当然誤差が出るので綺麗にできない。
ギギギギギとしてたんだけど、Text/Labelオブジェクトには「textWidth」といういいプロパティがあることを知った。
var lbl: Label = new Label(); lbl.visible = false; //文字列の幅が欲しいだけなのでとりあえずvisibleしておく(どうせ後で消すけど) lbl.text = "あいうえおかきくけこ"; this.addChild(lbl); //オブジェクトを追加 txt.validateNow(); //★ var n: Number = lbl.textWidth; this.removeChild(lbl); //オブジェクトを削除
とすることで、無事正確な文字幅を取得することができた。
ここのミソは★の「validateNow()」。このメソッドを呼ばないと再計算されないので、textWidthを呼んでもNaNになる。注意。
ちなみにここではLabelオブジェクトを使用したけど、TextオブジェクトとLabelオブジェクトでは
- Textオブジェクト (ワードラップ有)
- ベースとなるコントロール(ApplicationとかVBoxとか)の幅を超えた文字幅は取得できず、最大幅はベースとなるコントロールの幅となる
- Labelオブジェクト (ワードラップ無)
- ベースとなるコントロールの幅に関係なく指定した文字列の幅を取得できる
という違いがあった。ベースのコントロールが大きい場合はあまり気にならないけど、小さい場合は要注意。まあ当たり前っちゃ当たり前のことなんだけど、実際やってる最中は「?」となった。