Progression4のカスタムコマンド、EmbedFontDyamicLoder
埋め込みフォントって大変ですよね。
最近までずっとIDEから埋め込みをしていました。
パブリッシュに時間がかかるばかりで「もーいや!」と思っていたら、どうやらASから指定することができるようです。
FACEs: as3:フォントのダイナミックなローディング
CS3版 フォントのダイナミックなローディング | エントリー | _level0.KAYAC
ということでコマンドにしてみました。
Progression4です!
書き方
public function EmbedFontDynamicLoader(path:String, name:String = null, textfield:TextField = null, initObject:Object = null )
@param path フォントファイルへの相対パス
@param name フォントのリンケージ名
@param textfield フォントを適応するTextField
@param initObject initObject.sizeのようにTextFormatと同じように指定すると、TextFormatとして適応されます。
使い方1
使い方1「読み込みを行い、TextFieldにフォント適応をする」
new EmbedFontDynamicLoader("font.swf", "KozukaGo_Pro_R", textField )
上記のようなコマンドを書くと、第三引数として指定したTextFieldに”Helvetica_Bold_16″が適応されます。
AIRで利用する際には、EmbedFontDyamicLoderコマンドの以下のコメントを外してください。
//_context.allowLoadBytesCodeExecution = true;
使い方2「読み込みを行い、TextFieldにフォント適応を行い、TextFormatも設定する」
new EmbedFontDynamicLoader("font.swf", "KozukaGo_Pro_R", textField , { size:16, color:0xFF00FF } )
initObjectに、TextFormatの各種プロパティと一致する用に記述をすると、第三引数として指定したTextFieldにsetTextFormat()されます。
また、第三引数を省略した場合はinitObjectにtextFormatを指定していても無視されます。
使い方3「読み込みを行うが、TextFieldにフォントは適応しない」
必要なフォントファイルの読み込みだけを先に行い、適応は別に行う場合は上記のように記述します。
new EmbedFontDynamicLoader("font.swf")
読み込みを行い、Resourceに登録することで、読み込みの時間を短縮させたい時に利用します。
フォントファイルの読み込みにはLoadSWFコマンドを利用していますが、そのコマンドを実行するのみの処理になります。
僕はIndexSceneで使い方3で一気にswfファイルを読み込み、使い方2でTextFormatと一緒に指定するという使い方をよく使います。
コマンドの中身で、特別なことをしているわけではなく、CS3版のコードを使い、TextFormatを適応してあげただけです。
デモではIndexSceneにこんなコードを書いています。
package { import flash.text.TextField; import jp.progression.casts.*; import jp.progression.commands.display.*; import jp.progression.commands.lists.*; import jp.progression.commands.net.*; import jp.progression.commands.tweens.*; import jp.progression.commands.*; import jp.progression.data.*; import jp.progression.events.*; import jp.progression.executors.*; import jp.progression.scenes.*; /** * ... * @author ... */ public class IndexScene extends SceneObject { var textField:TextField; public function IndexScene() { textField = new TextField(); textField.text = "test"; container.addChild(textField); title = "EmbedFontDynamicLoaderDemo"; } protected override function atSceneLoad():void { addCommand( new EmbedFontDynamicLoader("font.swf", "KozukaGo_Pro_R", null ), 3, new EmbedFontDynamicLoader("font.swf", "KozukaGo_Pro_R", textField), 3, new EmbedFontDynamicLoader("font.swf", "KozukaGo_Pro_R", textField, { color:0x999999 } ) ); } } }
ソースファイル一式を置いておくので、ぜひいじってフィードバックください!書き換えてください!
http://alterna.in/demo/EmbedFontDynamicLoaderDemo/EmbedFontDynamicLoaderDemo.zip
ここでは初めましてです。島根人です。
いつも楽しみに見ています。
EmbedFontDynamicLoader、とても便利なクラスですね。
確かにインスタンス生成時に毎回読み込みにいってしまうのはつらいので、クラスのstatic変数に格納するのがいいと思います。
とは言え複数のフォントを使う場合もあるので、変数自体は配列を入れておきます。フォント名またはSWFのファイル名をキーにした連想配列を作って、コンストラクタに指定されたキーでundefinedなら読み込み、既に入っていたらそれを使うようにする、というのはいかがでしょうか。
配列はクラス内で参照できれば良いので、privateで問題ないかと思います。
>島根人さん
どうもー。キャッシュ機能つけてみました。
Progression4の機能で、Loadコマンドでロードしたものをキャッシュしてくれる機能がついたので、そっちを使う感じ作ってみました。
もしProgression3に対応するような感じになったらstaticなObjectを創る家事になりそうですねー。