実行時に埋め込みフォントをロードする

(サンプル一覧を表示する)

FlashDevelop を使って、実行時に埋め込みフォントをロードするテストをしてみました。

埋め込みフォントを実行時にロードするには、
埋め込みフォントの入った SWF ファイルを別途用意する必要があります。
Flash の実行画面
実行時に埋め込みフォントをロードする

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

実行時に埋め込みフォントをロードする

ソースコード

package 
{
	import ClassLoader;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.URLRequest;
	import flash.text.Font;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFieldType;
	import flash.text.TextFormat;
	
	/**
	 * 実行時に埋め込みフォントをロードするサンプル
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * ロードする SWF ファイルの URL
		 */
		private const url:String = "EmbedFont.swf";
		
		/**
		 * 外部 SWF ファイルの中からクラスを取得するためのオブジェクト
		 */
		private var loader:ClassLoader;
		
		/**
		 * メッセージ表示用テキストフィールド
		 */
		private var textField:TextField;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化イベント
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// テキストフィールドの初期化
			textField = new TextField();
			//textField.autoSize = TextFieldAutoSize.LEFT;
			textField.type = TextFieldType.INPUT;
			textField.x = 5;
			textField.y = 5;
			textField.width = 310;
			textField.height = 230;
			textField.border = true;
			textField.borderColor = 0xC0C0C0;
			textField.multiline = true;
			textField.wordWrap = true;
			textField.text = "";
			addChild(textField);
			
			// 使用可能なフォントの一覧を取得する
			var fontArray:Array = Font.enumerateFonts(true);
			
			// テキストフィールドの初期メッセージを設定
			textField.appendText("実行時にうめ込みフォントをロードするサンプル\n\n");
			textField.appendText("SWF ロード前の使用可能フォントの数 : " + fontArray.length + "\n");
			
			// SWF ファイルのロード
			loader = new ClassLoader();
			loader.addEventListener(Event.COMPLETE, onLoadComplete);
			loader.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoadError);
			loader.load(url);
		}
		
		/**
		 * クラスのロード時にエラーが発生した時
		 * @param	e
		 */
		private function onLoadError(e:Event):void
		{
			trace("onLoadError");
			textField.text = "SWF ファイルのロードに失敗しました。";
		}

		/**
		 * クラスのロードが完了した時
		 * @param	e
		 */
		private function onLoadComplete(e:Event):void 
		{
			trace("onLoadComplete");
			
			// ロードした SWF ファイルから、クラスをロードしてインスタンス化する
			var classRef:Class = loader.getClass("EmbedFont");
			var externalObject:Object = new classRef();

			// 外部の SWF ファイルから埋め込みフォントを取得して、
			// 親 SWF (今コードを書いている SWF) に登録する
			var font:Font = new externalObject.font;
			Font.registerFont(externalObject.font);
			
			// 使用可能なフォントの一覧を取得する
			var fontArray:Array = Font.enumerateFonts(true);
			
			// テキストフィールドの内容を更新
			textField.appendText("SWF ロード後の使用可能フォントの数 : " + fontArray.length + "\n");
			
			// テキストフォーマットの作成
			var format:TextFormat = new TextFormat();
			format.font = font.fontName;
			format.size = 20;
			
			// ロードした埋め込みフォントをテキストフィールドに適用する
			textField.setTextFormat(format);
			textField.embedFonts = true;
		}
		
	}
	
}
		

参照

外部リンク