`
windmark
  • 浏览: 32379 次
社区版块
存档分类
最新评论

AS3字体嵌入终极教程 附带unicodeRange获取器支持新老文本引擎(转)

    博客分类:
  • AS3
 
阅读更多

转自:http://bbs.9ria.com/forum-375-2.html

 

如果你的Flash使用了一种没有嵌入的字体,那你要小心,如果你的作品在其它没有安装这种字体的终端运行时,显示出的字体可能会很惨不忍睹,所以要使用嵌入字体,那么,该怎么嵌入字体呢?
下面的元数据标签网上一搜一把:

 

[Embed(source="xxx", fontName="xxx", mimeType="application/x-font")]

 

 

只要使用该元数据标签将一个字体文件(多为.ttf的文件)嵌入后即可直接使用TextFiled进行显示,看上去很简单,不过在下在具体的使用中发现了2个严重的问题,为了帮助大家不走弯路,特意啰嗦一下。
问题1:多数情况下我们只需要使用特定的字符即可,可是元数据标签提供的unicodeRange不能直接把需要的字符打进去,而是用该字符对应的unicode码(如:U+5927),那么我怎么获取每个字符的unicode码?
问题2:as3中有两种类型的文本呈现对象(fp10以后),一个是位于flash.text包的TextField,另一个是新的文本引擎FTE,位于flash.text.engine包的TextLine,按理说嵌入的字体应该两种文本都能支持,可是偏偏不是,看过帮助文档,原来新的引擎只支持一种称为压缩字体的cff格式的嵌入字体,而老的引擎呢只支持一般的字体格式,就是各用各的,那好办,新的引擎咱上网下个cff格式的字体不就行了,可是百度谷歌cff、cff下载和cff download后,傻了...
如果不弄明白这两个问题,我认为嵌入字体基本上等于没法用,现在我来解答第一个问题:其实要获取一个字符的unicode码很简单,直接上AS:

 

trace("U+"+"囧".charCodeAt(0).toString(16));

 

 

 

恭喜,你得到了“囧”的unicode码了,基于此我专门写了个简单的获取unicode码的swf,只需要输入文字后点击“获取脚本”就行了:
无标题.jpg 
这个小工具的源码和swf文件在下载包中都有附带的。
下面解决第二个问题,请跟着在下一起嵌入几个字后分别用新老文本引擎把他们显示出来吧:
1.先弄一个ttf字体文件来,最好去下一个艺术点的,什么,cff的格式要不要下?不用,让这个哥继续它的传说吧;
2.打开unicodeRange获取器,输入:“这句话有嵌入字体的支持,”,点击“获取脚本”按钮,你会得到下面的脚本:

 

package
{
 public class FontLibrary
 {
  [Embed(source="tff或其它字体文件的绝对或相对位置", fontName="该嵌入字体的名称", mimeType="application/x-font", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]
  public var embed_font:Class;
 }
}

 

 

3.新建一个AS项目,名称叫EmbedFontExample,需要注意的是SDK要选择4.0以上的,因为4.0以下的SDK不支持把嵌入的字体转换为CFF格式的字体,而4.0以上的SDK默认会将嵌入的字体转换为CFF格式的字体;
4.新建一个类FontLibrary,把之前得到的脚本粘贴到该类中;
5.将你下载的字体文件复制到和FontLibrary类的文件的同一目录下,更改以下元数据标签,我下载的是华文行楷,文件名为STXINGKA.TTF,所以我将元数据标签改为:

 

embedAsCFF="false"

 

 

[Embed(source="STXINGKA.TTF", fontName="hwxk", mimeType="application/x-font", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]

 

 

6.如果你是用FlexIDE,你会得到一个程序入口类EmbedFontExample,给这个类添加脚本如下:

 

package
{
 import flash.display.Sprite;
 import flash.text.*;
 import flash.text.engine.*;
 
 public class EmbedFontExample extends Sprite
 {
  public function EmbedFontExample()
  {
   //将嵌入字体类关联进本程序
   new FontLibrary();
   
   //老文本引擎
   var textFormat:TextFormat = new TextFormat();
   textFormat.font = "hwxk";
   textFormat.size = 20;
   
   var textFiled:TextField = new TextField();
   textFiled.embedFonts = true;
   textFiled.text = "这句话有嵌入字体的支持,这句话没有嵌入字体的支持。";
   textFiled.setTextFormat(textFormat);
   textFiled.width = 200;
   textFiled.wordWrap = true;
   addChild(textFiled);
   
   //新文本引擎
   var fontDescription:FontDescription = new FontDescription();
   fontDescription.fontLookup = FontLookup.EMBEDDED_CFF;
   fontDescription.fontName = "hwxk";
   var format:ElementFormat = new ElementFormat(fontDescription);
   format.fontSize = 20;
   var textElement:TextElement = new TextElement("这句话有嵌入字体的支持,这句话没有嵌入字体的支持。", format);
   
   var textBlock:TextBlock = new TextBlock();
   textBlock.content = textElement;
   
   createLines(textBlock);
  }
  
  private function createLines(textBlock:TextBlock):void
  {
   var yPos:Number = 200;
   var textLine:TextLine = textBlock.createTextLine(null, 200);
   while(textLine)
   {
    addChild(textLine);
    yPos += textLine.height+2;
    textLine.y = yPos;
    textLine = textBlock.createTextLine(textLine, 200);
   }
  }
 }
}

 

 

运行看看效果:
无标题2.jpg 
等等,怎么只出来了一个?老文本引擎怎么啥也没有啊(老文本引擎的x为0,新的为200,一上一下)?还记得我说过我去帮助里看过的东西么?老文本引擎不支持CFF类型的嵌入字体,新文本引擎只支持CFF类型的嵌入字体,而FlexSDK4.0以上的编译器默认会把嵌入的字体转换为CFF格式,那么怎么办呢?只需给编译器加一个不把字体转换为CFF类型的指令就行了,在unicodeRange获取器中勾选“嵌入为非CFF格式”后生成的脚本会多出该指令:

embedAsCFF="false"

 

好了,但是如果不把该字体转换为CFF格式,新的文本引擎又不能显示了,汗!那就添加两种字体类型吧,FontLibrary改变如下:

package
{
 public class FontLibrary
 {
  [Embed(source="STXINGKA.TTF", fontName="hwxk", mimeType="application/x-font", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]
  public var embed_font:Class;
  
  [Embed(source="STXINGKA.TTF", fontName="hwxk_noncff", mimeType="application/x-font", embedAsCFF="false", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]
  public var embed_font_noncff:Class;
 }
}

 

同时EmbedFontExample类也要改一下老文本引擎的textFormat对象的font属性:

textFormat.font = "hwxk_noncff";

 

好了再运行看看是不是行了:
无标题3.jpg 
现在我们看到,新老文本引擎对待嵌入字体还是有点不太一样的,除了cff格式外,老文本引擎如果要显示的字符没有嵌入他就不显示该字符了,而新文本引擎则会用设备默认的字体显示没有嵌入的字符,即老文本引擎的“没”和句号没有嵌入就不显示了,而新引擎则是用默认的字体代替。
进阶:
给字体添加一定的滤镜效果就能得到更好看的字体,比如加个发光和渐变滤镜,呵呵,以后Flash要显示个性字体不用再麻烦PS了,注意字体在swf中是用矢量保存的哦,可以无损的放大缩小。
关于FlexSDK4.0以下的嵌入cff格式用于新文本引擎的问题:
在FlexSDK4.0以下里有一个属性cff,可以这么用来将嵌入的字体转换为CFF压缩格式(FlexSDK4.0以下的嵌入字体默认是不会转换为CFF格式的,及新文本引擎不能显示嵌入字体),如:

[Embed(source="STXINGKA.TTF", fontName="hwxk", mimeType="application/x-font", cff="true", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]

 

悲剧的是这样编译器会报错而无法通过编译,到现在在下也没能找到可以解决该问题的方法,所以大家如果要让新文本引擎显示嵌入字体还是得使用FlexSDK4.0以上才行。

 

 

 

分享到:
评论

相关推荐

    Word转PDF文件,如何在PDF中嵌入字体[收集].pdf

    Word 转 PDF 文件中的字体嵌入方法 在软件开发中,经常需要将 Word 文档转换为 PDF 文件,并在 PDF 文件中嵌入字体,以满足某些杂志的上传要求,例如 ASCE 杂志。下面将详细介绍如何在 PDF 文件中嵌入字体。 首先...

    Flex3.0设备字体,字体嵌入

    ### Flex3.0 设备字体与字体嵌入详解 #### 一、背景介绍 在开发Flex应用程序时,设计师和开发者经常需要使用特定的字体来增强界面的美观度和独特性。然而,不同的用户系统可能存在字体差异,这可能导致设计好的文本...

    word to pdf嵌入字体的问题

    ### Word to PDF嵌入字体问题详解 #### 一、引言 在进行文档转换时,尤其是在将Word文档转换为PDF格式的过程中,确保字体正确嵌入是非常重要的一步。正确的字体嵌入不仅能确保文档的一致性和可读性,还能提高文档...

    AS3动态加载字体

    在ActionScript 3 (AS3)中,动态加载字体是一种技术,允许开发者在应用程序运行时加载和使用新的字体。这可以极大地提高应用的灵活性,尤其是对于那些需要展示各种独特字体或者用户可定制字体的应用。本知识点将深入...

    动态嵌入字体

    动态嵌入字体是一种在Flash(SWF)内容中使用特殊技术来实现字体显示的方法。这种方法主要是为了解决在Web上展示个性化或特定字体时遇到的问题,因为不同的用户计算机上可能并未安装所需字体,从而导致内容显示不...

    pdfbox转图片所需字体

    PDF文档可能包含嵌入字体,这意味着字体数据直接存储在PDF文件内部,任何支持PDF的阅读器都能正确显示文本。然而,不是所有PDF都嵌入了所有使用的字体,尤其是当字体受版权保护时。当PDFBox尝试将这样的PDF转换为...

    css3系列教程(嵌入字体网络字体).rar

    这个“CSS3系列教程(嵌入字体网络字体).rar”压缩包文件正是针对这一主题提供的一份详细教程,旨在帮助网页制作者创造出更具个性和视觉冲击力的头部效果,同时避免因受限于系统默认字体而影响设计美感。 一、CSS3...

    js 取字体列表(非IE)

    在JavaScript中,获取系统可用字体列表是一个常见的需求,特别是在网页设计和富文本编辑器中,以便为用户提供自定义字体选择。然而,JavaScript本身并不提供直接获取字体列表的API,尤其是在非IE浏览器中。传统的DOM...

    嵌入网页中的文本编辑器

    "FCKeditor"是此类编辑器的一个经典实例,它在早期Web开发中非常流行,提供了丰富的文本格式化选项,如字体、字号、颜色、对齐方式、插入图片、链接等,极大地提升了网页内容的编辑体验。 "FCKeditor"的使用方法...

    WPF在资源内嵌入字体

    在Windows Presentation Foundation (WPF) 中,内嵌字体是一种强大的特性,它允许开发者将特定的字体文件嵌入到应用程序资源中,以便在用户没有安装该字体的情况下也能正确显示文本。这样,开发人员可以确保应用程序...

    AS3获取JS回传值

    本教程将详细解释如何实现AS3获取JavaScript回传的值,并将这些值显示在Flash的文本框中。由于这种交互需要在实际的Web环境中运行,因此你需要将项目发布到IIS或其他网站服务器才能看到效果。 **1. 创建基本的AS3...

    C#获取系统已经安装的字体,并设置字体样式

    在C#编程中,获取系统已经安装的字体并设置字体样式是常见的需求,尤其是在开发桌面应用或者图形用户界面时。本文将深入探讨如何通过C#实现这一功能。 首先,我们需要了解C#中处理字体的基本类——`FontFamily`。这...

    WPF_嵌入字体_EmbeddedFont

    WPF_嵌入字体_EmbeddedFont

    富文本编辑 代码 嵌入WEB页面的文本编辑框

    富文本编辑器是一种在网页上实现用户可以进行格式化输入的工具,它允许用户像在桌面应用程序中那样编辑文本,包括插入图片、链接、格式化文本等操作。这些编辑器通常用于博客、论坛、在线表单等场景,使得非程序员也...

    富文本编辑器导出word

    3. **Word文档创建**:使用Apache POI创建一个新的Word文档对象,初始化必要的元素,如样式、字体、页面设置等。 4. **内容插入**:遍历解析后的HTML元素,根据其类型(如段落、标题、列表等)在Word文档中创建相应...

    @face-font 嵌入中文字体实例和ttf转换eot, woff, svg转换工具

    3. **TTF 转 SVG**:SVG 字体允许字体以矢量图形的形式存在,适用于一些老旧的 iOS 设备。工具如 `ttf2svg` 可完成这个转换。 在提供的压缩包 `网站字体转换工具` 中,应该包含这些转换工具的软件或在线服务,使得...

    检验Pdfsharp.dll 支持的语言及对应的字体

    3. **异常处理**:当检测到字体不支持某语言时,可能有处理机制来决定如何优雅地处理这种情况,比如替换为系统默认的多语言字体,或者提示用户安装缺失的字体。 4. **测试用例**:为了确保修改后的功能有效,通常会...

    【个人收集】as3实用小例

    `Flash嵌入字体的进阶方法.txt`探讨了如何在AS3中嵌入和使用非标准字体,确保跨平台一致性。这可能涉及Font类、系统字体和嵌入字体的字形选择。 8. **动态文本加链接**: 在AS3中,可以通过TextFormat和...

Global site tag (gtag.js) - Google Analytics