uzullaの日記

本家:about等:Twitter
 | 

2008-06-15

validateNow()とかLabelとかについて、常識なのかしらないけど…

| 09:57

ASで文字列を表示させるとき、

var _label:Label = new Label();
_label.text = 'ほげほげ';
this.addChildren(_label);

とかやりますやん、でもコレだと表示できませんよね。

これは当然ですね、横幅がないんです。

Widthとheightを指定してあげなきゃいけないですね。

指定してみた

var _label:Label = new Label();
_label.text = 'ほげほげ';
_label.width = 40;
_label.height = 20;
this.addChildren(_label);

こうやると表示できますね、うん。

でもこのテキストの内容が可変の時、過不足ないサイズに広げるにはどうすればいいのか。

Mxmlとかでやると、自動的にサイズが広がるから値は取れるはず。

リファレンスみたら1分で解りました。


textWidth,textHeightを使うね

var _label:Label = new Label();
_label.text = 'ほげほげ';
_label.width = _label.textWidth;
_label.height = _label.textHeight;
this.addChildren(_label);

textWidthとtextHeightは入力されたテキストの(仮想的な)横幅と縦幅を取り出せます。

こうすると、過不足ないサイズのLabelができそうですよね。


でも、やると解りますが、これはダメなコードなんですよね。_label.widthは0になっちゃう。

これは_label.textWidthの返値がNaNであるからなんですね(だじゃれ)

最初上の問題がなんで出るのかわかんなかったんですけど、なんか別の関数に飛んだりして、ちょっと経つと取得できるようになる、ってことはImageとかと同様に、非同期でやらなきゃいけない?そんなのイヤだなーとかおもってたら、そんなことはなかった。


validateNow()を使う。

ドキュメント*1を読んだら、validateNow()を読んだらその瞬間に様々な計算がされて、textWidthとかが取得できるよーって書いてあった、なるほどー!

var _label:Label = new Label();
_label.text = 'ほげほげ';
_label.validateNow();
_label.width = _label.textWidth;
_label.height = _label.textHeight;
this.addChildren(_label);

こうですか!


でもなぜかうごきませんでした!

相変わらずNaNが帰ってきます、なんでだよこのヤロー!(だじゃれ)


オチは、addChildされてなかったから。

結論からいえば、

var _label:Label = new Label();
this.addChildren(_label);
_label.text = 'ほげほげ';
_label.validateNow();
_label.width = _label.textWidth;
_label.height = _label.textHeight;

こう書いたら動くよ!addchildrenしてからじゃないとちゃんと計算してくれないらしい。

めでたしめでたし!


個人的には全部設定してからaddChildしたかったけど、そういう書き方は普通じゃないんだね。

まずaddChildrenがAS的なんだろうか。


しかし文字が欠ける

でも上のをやってみると完璧ではなくて、文字の下pxと、右が数px欠けます。

なんでだろーとおもったけど、多分これはPaddingがあるんだろうなー。

(多分これのWidthはLabelの子のUITextFieldの幅なんだよね)

だから、多分StyleのpaddingLeftとか、もしくはTextLineMetricsを取得して、適当に足し算してあげればいいんだろう。


でもこれは試してません、安易に適当なpx数足してにげちゃったから(苦笑)


こういう超基本的な事は

どこで学ぶべきなんだろうか。

ググったけど、ぱっとはこの問題みつけられなかったんだよね。

(だから、このエントリを書いた)

言語を勉強するときはリファレンスだけ読めばいいやでやっているけど、Flex(Flash)は複雑なだけに結構暗黙の了解的な事が多く、こういう皆ならわかっている様な所でいちいち突っかかるよ…。

 |