標籤雲

搜尋此網誌

2010/04/09

Flash 如何在 SWF 檔案中內嵌字型

很久沒寫 blog 的我今天再來寫一篇基礎文章吧

稍微有在寫 actionscript 的人應該碰過這樣的狀況,
就是你想在某個地方放一個動態文字欄位
但是動態文字如果不內嵌字型的話,就會是醜醜的鋸齒狀文字
要是用了使用者電腦沒有的字體,還顯示不出來哩

那麼要如何在SWF檔案中內嵌字型呢?
作法其實要看你的狀況而定

1. 動態文字的內容是固定的
如果動態文字的內容是固定的,這樣的狀況可以考慮用 Flash IDE 的功能把要用的字內嵌在 SWF 檔案中
由於中文字數遠多於英文字母,因此不建議全部嵌入
只嵌入我們要的文字即可
首先建立一個動態文字欄位 embed_txt,然後把你要內嵌的文字內容全部貼進去
接下來在屬性面板打開字元內嵌的對話框
並在"包括下列字元"這個選項,選擇"自動填字",然後按下確定就可以了。
(當然你也可以自己把會用到的字填到這一欄中)
接下來你可以把 embed_txt 裡的字給刪掉,或將他的 visible 設為 flase
嵌入的文字在同一個檔案中是可以共用的
因此同一個檔案如果有其他需要使用相同內嵌字的,只要內嵌一個空白就可以,不用重複嵌入。

2. 動態文字的內容較多或不固定
如果動態文字的內容是不固定或比較多,我們就該考慮是否要把整個字型給嵌入
要嵌入整個字型當然也可以在字元內嵌的對話框中去做。
但這樣整個字型都會包在要執行的 SWF 檔中,好一點的作法是把它變成另一個檔案再載入進來使用
要發布字型的SWF檔案還是要靠 Flash IDE
在 CS4 的 Library (元件庫)面板,點開右上角的功能表,然後選擇"新增字體"
選擇你要嵌入的字體及樣式(如果是要把字體當做點陣圖嵌入的話要順便指定字體大小)
連結部份勾選"匯出給 Actionscript 使用",並指定類別名稱
(順便可以看到他的基底類別是 flash.text.Font)
確定後發布 SWF 檔。這樣我們就有一個字型檔案了
接下來在另一個檔案把它載入吧
開一個新檔案並輸入以下程式碼:
var ldrContext:LoaderContext = new LoaderContext();
var wordLdr:Loader = new Loader();
var myFont:Font;

//指定載入的SWF檔的 applicationDomain 為 currentDomain
ldrContext.applicationDomain = ApplicationDomain.currentDomain;

wordLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, onWordLdrComplete);
try{
 //載入事先準備好有內嵌字型的 SWF 檔案
 wordLdr.load(new URLRequest("DFLiKaiShu-Md.swf"), ldrContext);
}catch(err:Error){
 trace(err);
}

function onWordLdrComplete(event:Event):void{
 //使用  getDefinitionByName 傳入類別名稱
 var fontClass:Class;
 fontClass = getDefinitionByName("Font_DFLiKaiShuMd") as Class;
 //註冊字型
 Font.registerFont(fontClass);
 //如果不知道字型名稱,就把它 new 出來,就可讀取 fontName 屬性
 myFont = new fontClass;
 useFont();
}

var tf:TextFormat;
var t0:TextField= new TextField();
t0.autoSize = TextFieldAutoSize.LEFT;
//embedFonts = true 表示使用內嵌字體
t0.embedFonts = true;
this.addChild(t0);

function useFont():void{
 //字型的名稱如果已經知道的話,不用new出myFont直接填入名稱字串也是可以
 tf = new TextFormat(myFont.fontName, 18); 
 t0.defaultTextFormat = tf;
 t0.text = "這裡的字會是華康儷楷書!!";
}
這樣就可以把內嵌字型給載入進來了,不過字型SWF檔案動輒好幾MB
最好是控制動態文字的字型不要太多,否則讀進這麼大容量的檔案也不是一件好事阿。

2 則留言:

Unknown 提到...

CS5 對於字型的處理已經進步嚕
但這篇還是有一點參考價值的

Hannah 提到...

超棒的!!!謝謝你的分享
不過我會出來中文竟然跑不出來??只讀得懂數字跟英文....??