在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文件)也会变的很大.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值