- 2022.03.28 Monday
- スポンサーサイト
-
一定期間更新がないため広告を表示しています
- | スポンサードリンク | - | | - | - | pookmark |
- 2010.07.28 Wednesday
- 外部埋め込みフォントのロードと使用
-
外部埋め込みフォントのロードと使用
FontAssetクラスとEmbedFontクラスで EmbedFont.swfをつくります。
package { public class FontAsset { // if you want to embed font, add font to folder and out under line. //[Embed(source="/assets/font/MyriadWebPro.ttf", fontName="myfont", fontWeight="Semibold")] [Embed(source="/assets/mplus-1c-black.ttf", fontName="myfont")] public var font:Class; public function FontAsset() { // throw new Error("you cannot create FontAsset Class instance") } } }
package { import flash.display.Sprite; import flash.events.Event; import flash.text.Font; import FontAsset; /** * 埋め込みフォントが入った SWF * @author Hikipuro */ public class EmbedFont extends Sprite { /** * 埋め込みフォント */ //[Embed(source='../font/mplus-1c-black.ttf', fontName='mplus-1c-black')] //private var embedFont1:Class; private var fontins:FontAsset; /** * コンストラクタ */ public function EmbedFont():void { //FontAsset; fontins=new FontAsset() } /** * 埋め込みフォントを取得する */ public function get font():Class { return fontins.font; } } }
それであとはHikipurosanのClassLoaderクラスでとMainクラスで読み込みますと。。。
package { import flash.display.Loader; import flash.display.LoaderInfo; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.HTTPStatusEvent; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.events.SecurityErrorEvent; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; /** * ロード操作が開始した時に発行するイベント * @eventType flash.events.Event.OPEN */ [Event(name = "open", type = "flash.events.Event")] /** * unload() メソッドを使用して削除されるたびに発行するイベント * @eventType flash.events.Event.UNLOAD */ [Event(name = "unload", type = "flash.events.Event")] /** * ダウンロード処理を実行中にデータを受信した時に発行するイベント * @eventType flash.events.ProgressEvent.PROGRESS */ [Event(name = "progress", type = "flash.events.ProgressEvent")] /** * クラスのロードが完了した時に発行するイベント * @eventType flash.events.Event.COMPLETE */ [Event(name = "complete", type = "flash.events.Event")] /** * ロードされた SWF ファイルのプロパティおよびメソッドがアクセス可能で使用できる状態になった時に発行するイベント * @eventType flash.events.Event.INIT */ [Event(name = "init", type = "flash.events.Event")] /** * ロードされた SWF ファイルのプロパティおよびメソッドがアクセス可能で使用できる状態になった時に発行するイベント * @eventType flash.events.HTTPStatusEvent.HTTP_STATUS */ [Event(name = "httpStatus", type = "flash.events.HTTPStatusEvent")] /** * クラスのロードに失敗した時に発行するイベント * @eventType flash.events.IOErrorEvent.IO_ERROR */ [Event(name = "ioError", type = "flash.events.IOErrorEvent")] /** * ロード時にセキュリティエラーが発生した時に発行するイベント * @eventType flash.events.SecurityErrorEvent.SECURITY_ERROR */ [Event(name = "securityError", type = "flash.events.SecurityErrorEvent")] /** * 外部 SWF ファイルからクラスをロードするためのクラス * * ・このクラスの詳細 * http://livedocs.adobe.com/flex/3_jp/langref/flash/system/ApplicationDomain.html#includeExamplesSummary * @author Hikipuro */ public class ClassLoader extends EventDispatcher { /** * SWF ファイルをロードするためのローダ */ private var loader:Loader; /** * SWF ファイルの URL */ private var url:String; /** * ローダの URLRequest */ private var request:URLRequest; /** * ロードされたクラス */ private var loadedClass:Class; /** * コンストラクタ */ public function ClassLoader() { var loaderInfo:LoaderInfo; // イベントリスナの登録 loader = new Loader(); loaderInfo = loader.contentLoaderInfo; loaderInfo.addEventListener(Event.OPEN, openHandler); loaderInfo.addEventListener(Event.UNLOAD, unloadHandler); loaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler); loaderInfo.addEventListener(Event.COMPLETE, completeHandler); loaderInfo.addEventListener(Event.INIT, initHandler); loaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); } /** * SWF をロードする * @param lib SWF ファイルの URL */ public function load(url:String):void { this.url = url; request = new URLRequest(url); var context:LoaderContext = new LoaderContext(); context.applicationDomain = ApplicationDomain.currentDomain; loader.load(request, context); } /** * クラス名からクラスを取得する * @param className クラス名 * @return */ public function getClass(className:String):Class { try { var loaderInfo:LoaderInfo; var applicationDomain:ApplicationDomain; loaderInfo = loader.contentLoaderInfo; applicationDomain = loaderInfo.applicationDomain; loadedClass = applicationDomain.getDefinition(className) as Class; return loadedClass; } catch (e:Error) { throw new IllegalOperationError(className + " definition not found in " + url); } return null; } /** * イベントハンドラ * ロード操作が開始したときに送出されます。 * @param e */ private function openHandler(e:Event):void { dispatchEvent(e); } /** * イベントハンドラ * ロードされたオブジェクトが Loader オブジェクトの unload() メソッドを使用して削除されるたびに、 * LoaderInfo オブジェクトによって送出されます。または 2 番目のロードが同じ Loader オブジェクトによって実行され、 * ロード開始前に元のコンテンツが削除された場合に、LoaderInfo オブジェクトによって送出されます。 * @param e */ private function unloadHandler(e:Event):void { dispatchEvent(e); } /** * イベントハンドラ * ダウンロード処理を実行中にデータを受信したときに送出されます。 * @param e */ private function progressHandler(e:ProgressEvent):void { dispatchEvent(e); } /** * イベントハンドラ * データが正常にロードされたときに送出されます。 * @param e */ private function completeHandler(e:Event):void { dispatchEvent(e); } /** * イベントハンドラ * ロードされた SWF ファイルのプロパティおよびメソッドがアクセス可能で使用できる状態の場合に送出されます。 * @param e */ private function initHandler(e:Event):void { dispatchEvent(e); } /** * イベントハンドラ * ネットワーク要求が HTTP を介して行われ、HTTP ステータスコードを検出できる場合に送出されます。 * @param e */ private function httpStatusHandler(e:HTTPStatusEvent):void { dispatchEvent(e); } /** * イベントハンドラ * 入出力エラーが発生してロード処理が失敗したときに送出されます。 * @param e */ private function ioErrorHandler(e:IOErrorEvent):void { dispatchEvent(e); } /** * イベントハンドラ * ローダでセキュリティエラーが起こった時 * @param e */ private function securityErrorHandler(e:SecurityErrorEvent):void { dispatchEvent(e); } } }
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; } } }
- | whaison | ActionScript3.0 | 22:47 | comments(0) | - | pookmark |