稍微有在寫 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 則留言:
CS5 對於字型的處理已經進步嚕
但這篇還是有一點參考價值的
超棒的!!!謝謝你的分享
不過我會出來中文竟然跑不出來??只讀得懂數字跟英文....??
張貼留言