2012-01-24 2 views
2

私はMovieClipに含まれるダイナミックテキストフィールドのみからなるライブラリMovieClipクラスを持っています。AS3 TextLineMetricsはテキストの幅を取得するBEFOREオブジェクトが表示リスト

このMCをインスタンス化し、textFieldにテキストを取り込み、結果のテキストの幅を取得し、幅が定義済みのMIN_WIDTH値より小さい場合は、さらにテキストを追加します。

幅がMIN_WIDTHの値以上の場合は、このMovieClipクラスを表示リストに追加します。

私の質問は、textFieldが表示リストに追加される前に、Textlinemetricsを使用してtextFieldのテキストの長さを取得できるかどうか知っていますか?

答えて

2

テキストフィールドを作成して構成したときに、表示リストに追加することなくテキスト測定が正常に機能するため、次の情報が欠落しています。

このテクニックは、TextFieldを完全に構成した後に、「text」プロパティLASTを設定することを確認することです。 "text"プロパティを設定すると、以前に設定したすべての設定を考慮して、レイアウトを完成させるように見えます。

「text」プロパティを設定してから、multilineやembedFontsなどの他の設定を変更している可能性があります。これを行うと、getLineMetricsは正しい値を返しません。その後、 "text"プロパティを設定してgetLineMetricsを再度チェックすると、値は正しいでしょう。この例とトレース文の後のコメントを参照してください。

var tf:TextField = new TextField(); 
tf.defaultTextFormat = new TextFormat("Arial Black", 16, 0, false); 
tf.embedFonts = true; 
tf.text = "Hello"; //set text last 
trace(tf.getLineMetrics(0).height); //Traces 22.55 (correct) 

var tf2:TextField = new TextField(); 
tf2.defaultTextFormat = new TextFormat("Arial Black", 16, 0, false); 
tf2.text = "Hello"; //set text first 
tf2.embedFonts = true; //modify a property after setting text seems to make the TextField "dirty" 
trace(tf2.getLineMetrics(0).height); //Traces 1.15 (incorrect) 

var tf3:TextField = new TextField(); 
tf3.defaultTextFormat = new TextFormat("Arial Black", 16, 0, false); 
tf3.text = "Hello"; 
tf3.embedFonts = true; //modifying a property after setting the text seems to make the TextField "dirty" 
tf3.text = "Hello"; //setting the text again seems to fix the problem 
trace(tf3.getLineMetrics(0).height); //Traces 22.15 (correct) 

ここでの教訓は、TextFieldの問題を構成する順序です。たとえば、defaultTextFormatプロパティを使用してテキストを設定する必要があります。設定しないと、設定した新しいテキストがdefaultTextFormatを取得しません。その場合、フォントがオンになっていて、埋め込まれていない他のデフォルトのフォントが使用されていると、テキストがまったく表示されないことがあります。したがって、まずdefaultTextFormatを設定し、他のプロパティを設定し、getLineMetricsを呼び出す直前に "text"を最後に設定してください。

ここでは、作成したこの関数を使用します。 TextFieldの重要なプロパティ(text、type、multiline、selectable、embedFonts)を最初に設定し、その後のパラメータはTextFormatコンストラクタのものと同じ順序で設定する必要があります。プロパティが正しい順序で設定され、テキストが最後に割り当てられ、TextFieldの作成が1つのステートメントに減らされます。

public static function CreateTextField(text:String = "", type:String = null, multiline:Boolean = false, selectable:Boolean = true, embedFonts:Boolean = false, font:String=null, size:Object=null, color:Object=null, bold:Object=null, italic:Object=null, underline:Object=null, url:String=null, target:String=null, align:String=null, leftMargin:Object=null, rightMargin:Object=null, indent:Object=null, leading:Object=null):TextField 
{ 
    var tf:TextField = new TextField(); 
    tf.defaultTextFormat = new TextFormat(font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading); 
    tf.embedFonts = embedFonts; 
    tf.multiline = multiline; 
    tf.selectable = selectable; 
    tf.type = type; 
    tf.text = text; //setting text last ensures the text line metrics returns correct values 
    return tf; 
} 
+0

コードをコピーしてメインタイムラインのFlash CS4に貼り付けると、同じ番号が表示されません。私は0,1.15,0を得ています。 – MrB

+0

あなたのフォントは埋め込まれていません。ライブラリにArial Blackを埋め込む必要があります。使用カウントがゼロの場合、実際にフォントが埋め込まれていることを確認するには、 "export for actionscript"をチェックする必要があります。フォントを埋め込まなければ、22.55ではなく0が表示されます。 – Triynko

0

確かに私が知る限り、TextLineMetricsは、テキストフィールドが表示リストにあるかどうかに関係なく機能します。あなたはこれを試してもうまく動作しませんでしたか?もし私があなたのコードを教えてください - 私はそれがちょうどうまくいくはずのものを見逃していない限り。

+0

これは間違いなく機能しますが、何か不足しています。私の答えを見てください。私は自分自身(この質問に私を導いた)この問題にぶち当たっていました。 2つの唯一の違いはいくつかのステートメントの順番だったので、 "text"プロパティを設定した後に "embedFonts"などの他のプロパティを設定すると、getLineMetricsは不正な値を返します。したがって、他のプロパティを設定した後、最後に "text"プロパティを設定してから、getLineMetricsが正しい値を返します。 – Triynko

関連する問題