「TextField」カテゴリーアーカイブ

外部swfからフォントをロードする際の注意点

これまたハマったのでメモ。

ライブラリで「新規フォント…」を選択、リンケージ設定して単独のswfとして書きだし、本体のswfと分離して、外部swfからフォントを埋め込むテクニックがありますが、この時、本体側のテキストフィールドに同じフォントが指定されていると、フォントの適用ができません。
例えば、フォントを適用しようとするtextFieldに同じフォントが指定されていると、文字が表示されません(textFieldはフォント埋め込みせず、テキストは空の状態)。
またムービークリップがmc1,mc2とタイムライン上に時系列に並んでいる(例:1-5フレームにmc1、6-10フレームにmc2)場合で・・・
  • mc1には、外部swfからASでフォント適用するtextFieldがある。
  • mc2には、外部swfのフォントが指定されたtextFieldがある。
のようになっていると、最初にmc1を表示したときには文字が表示されているが、mc2を表示した後に再度mc1を表示すると、文字が見えないという現象が起きます(mc2のtextFieldはテキストの有無は問わず)。
正確な理由はわかりませんが、本体swfと外部swfで同じ名前のフォントを使おうとしてコンフリクトしているとか、既に本体側にフォントがあると見なされてスルーされるか..でしょうか。
わざわざ外部swfにするフォントを本体側に指定すること自体が無意味なわけですが、レイアウト確認用に文字を入れておいて、後から外部フォント化するなど、指定が残ってしまう場合もあるので、要注意だと思います(実際、ハマりましたし)。
外部swfからフォントをロードする方法については、下記サイトを参考にしました。感謝。

半角相当での文字数を調べる

今更だけど「全角●●文字まで」って入力制限があって、単に文字数だと全角も半角も1文字になってしまうので、関数を書いてみました。
文字をエンコードしてみて1文字なら半角、2文字以上なら全角3文字を越えたら全角・・・っていう判断です。String.length()は改行コードも1文字にカウントするので、改行コードは統一した上で除外(半角カナが3文字の場合があるので修正)。
これが最善かはわかりませんが…。みんなどうやってるんだろう?
//半角相当での文字数を調べる(改行コードは除外)
function xGetCharLength(str:String):int {
//改行コード統一
var val:String = str.replace(“\r\n”,”\r”).replace(“\n”,”\r”);
var array:Array = new Array();
var count_char:int = 0;
for (var i:int = 0; i<val.length; i++) {
//改行コードは除外
if (val.charCodeAt(i) != 13) {
                        if (escapeMultiByte(val.charAt(i)).length > 1) {
if (escapeMultiByte(val.charAt(i)).length > 3) {
count_char += 2;
} else {
count_char+=1;
}
}
}
return count_char;
}
[2010.12.16 訂正]

野中さんのご指摘を受けて、訂正しました。野中さんが書かれた文字数チェックはこちら。

文字列の有無によるテキストフォーマット設定方法の違い

ずっと前に個人的にメモってたんだけど、今日「あれ?」となったので改めてココに書いておきます。

———————————————

TextFieldのフォーマットを設定するときに、getTextFormat,setTextFormatを使う。

でもテキストがないTextFieldだとフォーマットが適用されない。その場合は、defaultTextFormatを使う。

要は・・・

・setTextFormat>テキストがある場合

・defaultTextFormat>テキストがない場合

ということらしい。

//テキストフォーマット:設定(テキストあり)
function xSetTextFormat(txt:TextField):void {
var tf:TextFormat = txt.getTextFormat();
tf.color = “0xff0000”
//空のテキストに対しては、
//defaultTextFormatを使うこと。
txt.defaultTextFormat = tf;
}
//テキストフォーマット:設定(テキストなし)
function xSetTextFormat2(txt:TextField):void {
var tf:TextFormat = txt.getTextFormat();
tf.color = “0xff0000”
//入力済みテキストに対しては、
//setTextFormatを使うこと。
txt.setTextFormat(tf);
}