在flex中如何使用嵌入字體

嵌入字體
語法
[Embed(source="C:/WINDOWS/Fonts/arial.ttf", fontName="Arial", mimeType="application/x-font")]
private var ArialFont:Class;

source: 字體文件所在路徑(本地)
fontName: 程序中所使用的字體別名
mimeType: 照抄就行了=_=

其中source還可以是指定爲字體名稱,而不一定是字體文件.另外還有其它屬性可以設置,詳細查看這裏

在flex中,所有非系統安裝字體,都需要註冊後,才能使用.
對於一個用上述方法直接嵌入字體的flex程序,該嵌入字體會被自動註冊.
可以通過以下程序查詢
var font_list:Array = Font.enumerateFonts();
for(var i:int=0; i<font_list.length; i++)
    trace(Font(font_list[i]).fontName);
嵌入的字體會排列在前面.

問題是,如果系統裏面有這個字體,我何必還要去嵌入呢?
假如你的系統裏面有個奇怪的字體,當你肆無忌憚的用在了你的項目裏,而整個作品仍到網上後,其它用戶的機器裏面沒有這個奇怪的字體,他們可能就看不到,或者看到的是他們系統中所帶字體顯示出來的文字.
這顯然不是你想要的,所以,在使用一些別人可能沒有的字體時,嵌入是很有必要的.但如果就這樣直接嵌入,最直接的影響就是加大swf文件的大小.可憐我們這些用漢字的,一箇中文字體動不動就幾M...orz.如果一個項目有一堆swf要用幾個相同的中文字體,每個swf都嵌一遍,估計這個項目加起來不會比帝國時代來的小-_-.說的再技術性一點,這麼做還不便於維護,修改等等......
此類問題可算是老生常談了,所以我們要做的辦法就是共享字體.

這個方法在flash裏面很簡單,只要在庫中選擇添加新字體,然後選擇自己要的字體,修改元件屬性爲共享導出,最後發佈就行了.具體看這裏

整個過程就是如何去使用共享庫,這個技術很古老了,但還是很管用的.

到了flex2,這個過程實際上更簡單了,如果有flash的朋友,可以直接看flex的幫助 - 如何使用flash類型的字體

我這裏要講的是,不用flash,直接用flex完成所有動作.

首先,挑個要嵌入的字體,比如04b_08,這個字體不是每個人都裝的.因爲flex可以用程序來支持直接嵌入字體,所以挑的字體不管是否已經安裝在系統中,都是無所謂的.測試的時候,你也可以把安裝在系統中的字體先刪除(記得備份),有些系統字體是無法刪除的,比如Arail,Verdana,宋體等.

接着,建立一個as文件,叫FontAssets.as好了,寫入如下代碼後保存
package
{
    import flash.display.Sprite;
    public class FontAssets extends Sprite
    {
        [Embed(source="assets/04b_08.ttf", fontName="04b_08", mimeType="application/x-font")]
        public var PixelFont:Class;
    }
}
as3語法我就不多說了,不清楚的看這裏

爲什麼要繼承Sprite呢?
因爲這個swf文件要在以後的程序中被加載.被加載的swf基類必須是繼承Sprite的.你不信的可以試試不繼承,這個swf可以通過編譯,但加載他的就無法通過編譯了,如果關掉嚴格檢測,運行時就會拋異常...
其實嘛,想想flash,root的類型就是MovieClip,是必然存在的,所以要生成一個swf,必須繼承Sprite也是合理的.因爲在as3裏面,MovieClip是繼承Sprite的

兩個字體對象,爲什麼要聲明爲public呢?
因爲到時候要在外部訪問這兩個對象呀.當然,有心人也可以用getter方法來設置成爲"只讀"的,我這裏就懶一下了^^_.

接着,建立一個mxml文件,叫testSharedFonts.mxml.寫入以下代碼並保存
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
 xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="absolute"
 styleName="plain"
>
  <mx:Script>
  <![CDATA[
    private function fontLoadComplete(evt:Event):void
    {
       try{
        Font.registerFont( evt.target.content["PixelFont"] );

        txt1.setStyle("fontFamily", "04b_08");
       }
       catch(e:Error){
        trace(e.toString());
       }
    }
  ]]>
  </mx:Script>
    <mx:SWFLoader source="FontAssets.swf" complete="fontLoadComplete(event);"/>
    <mx:VBox>
        <mx:Text id="txt1" text="test words" fontSize="12"/>
        <mx:Text id="txt2" text="test words" fontSize="12"/>
    </mx:VBox>
</mx:Application>

好了,字體嵌入成功,需要解釋嗎?語法方面看手冊吧,呵呵.要注意以下幾點

1.註冊字體的時候,訪問PixelFont的方法是當初AS2時候典型的作弊方法,目的爲了騙過編譯器,省的它說,當前對象沒有這個變量或方法.但是 AVM2比較牛,如果訪問的變量或方法確實不存在或者是訪問權限不對,它會在運行時拋異常,這也是爲什麼,上面我要聲明爲public的原因!
2.加載進來的共享字體,一定要先註冊才能使用,對於FontAssets.swf,前面說過,當PixelFont在嵌入的同時就已經註冊好了,但是對於testSharedFonts.swf,則不是,所以加載完了FontAssets.swf之後,還要註冊.
3.一個FontAssets可以同時嵌入多個字體,這樣就可以形成一個共享字體庫,但要注意如果字體太多,這個庫(swf文件)也會變的很大.
發佈了43 篇原創文章 · 獲贊 0 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章