本文和大家重点讨论一下在Flex中嵌入Flex字体方法,在Flex中所有非系统安装Flex字体都需要注册后才能使用。希望本文的介绍能让你有所收获。
在Flex中嵌入Flex字体方法总结
嵌入Flex字体
语法
- [Embed(source="C:/WINDOWS/Fonts/arial.ttf",
- fontName="Arial",
- mimeType="application/x-font")]
- private var ArialFont:Class;
source: 字体文件所在路径(本地)
fontName: 程序中所使用的字体别名
mimeType: 照抄就行了=_=
其中source还可以是指定为字体名称,而不一定是字体文件.另外还有其它属性可以设置,详细查看这里
在Flex中所有非系统安装Flex字体都需要注册后才能使用。对于一个用上述方法直接嵌入字体的Flex程序,该嵌入字体会被自动注册。
可以通过以下程序查询:
- var font_list:Array = Font.enumerateFonts();
- for(var i:int=0; i<font_list.length; i++)
- trace(Font(font_list[i]).fontName);
嵌入的Flex字体会排列在前面.
◆问题是,如果系统里面有这个字体,我何必还要去嵌入呢?
假如你的系统里面有个奇怪的字体,当你肆无忌惮的用在了你的项目里,而整个作品仍到网上后,其它用户的机器里面没有这个奇怪的字体,他们可能就看不到,或者看到的是他们系统中所带字体显示出来的文字。这显然不是你想要的,所以,在使用一些别人可能没有的字体时,嵌入是很有必要的.但如果就这样直接嵌入,最直接的影响就是加大swf文件的大小.可怜我们这些用汉字的,一个中文字体动不动就几M...orz.如果一个项目有一堆swf要用几个相同的中文字体,每个swf都嵌一遍,估计这个项目加起来不会比帝国时代来的小-_-.说的再技术性一点,这么做还不便于维护,修改等等......
此类问题可算是老生常谈了,所以我们要做的办法就是共享字体.
这个方法在flash里面很简单,只要在库中选择添加新字体,然后选择自己要的字体,修改元件属性为共享导出,最后发布就行了.具体看这里
整个过程就是如何去使用共享库,这个技术很古老了,但还是很管用的,到了Flex2,这个过程实际上更简单了,如果有flash的朋友,可以直接看Flex的帮助 - 如何使用flash类型的字体
我这里要讲的是,不用flash,直接用Flex完成所有动作.
首先,挑个要嵌入的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>
◆Flex字体嵌入成功,要注意以下几点
1.注册字体的时候,访问PixelFont的方法是当初AS2时候典型的作弊方法,目的为了骗过编译器,省的它说,当前对象没有这个变量或方法.但是 AVM2比较牛,如果访问的变量或方法确实不存在或者是访问权限不对,它会在运行时抛异常,这也是为什么,上面我要声明为public的原因!
2.加载进来的共享字体,一定要先注册才能使用,对于FontAssets.swf,前面说过,当PixelFont在嵌入的同时就已经注册好了,但是对于testSharedFonts.swf,则不是,所以加载完了FontAssets.swf之后,还要注册.
3.一个FontAssets可以同时嵌入多个字体,这样就可以形成一个共享字体库,但要注意如果字体太多,这个库(swf文件)也会变的很大.
【编辑推荐】