字体未嵌入Flash CS4 AS3

3
也许你能帮我解决一个问题。项目的URL是:http://www.mauriciogiraldo.com/vgline/beta/ 这是一个由Drupal驱动,通过AMFPHP连接的AS3 Web应用程序。数据传输到Flash没有问题,我已经验证了UTF-8编码也没有问题。问题可以更好地在以下URL中看到:

http://www.mauriciogiraldo.com/vgline/beta/#/146

该链接的纯文本版本:

http://www.mauriciogiraldo.com/vgline/node/146

(注意那个人的名字)
字体是Inconsolata,尽管如果必要的话我可以使用任何等宽开源字体。您可以看到我已经嵌入了字体(我甚至选择了动态文本字段来嵌入整个字符集),以及库中的“新字体”菜单。 Inconsolata在CS4创作工具中显示为带星号的(根据Adobe文档的说法,这意味着该内容已被嵌入)。
我尝试过其他字体嵌入选项,但都无济于事。当在创作中使用Inconsolata时,它似乎具有“ō”字符,但在动态文本中却没有显示出来。
我还遇到另一个问题:如果使用静态文本字段,则不会嵌入字体(WTF)。我必须将字段转换为动态字段,然后才能正常工作(左上角的“the videogame history timeline”是动态文本字段,尽管我更喜欢它不是... 还有其他一些)。如果使用静态文本字段,则字体将转换为某种Times New Roman字体。
该文本是AS3创建的(以及搜索结果)。
我正在使用HTML(.htmlText)嵌入文本并使用CSS进行样式设置。
整个代码都是开源的,可以在此处找到:

http://code.google.com/p/vgline/

这里有一个我如何填写文本字段的示例:

http://code.google.com/p/vgline/source/browse/trunk/src/TLDetail.as

这样的代码片段如下:

 var ss:StyleSheet = new StyleSheet();
 var css:String = ".title { color:#333333; font-family:Inconsolata; font-size:16; leading:2; } ";
 css += ".date { color:" + StringUtils.rgb2web(data.color.r, data.color.g, data.color.b) + "; font-family:Inconsolata; font-size:14; leading:4; } ";
 css += ".text { color:#333333; font-family:Inconsolata; font-size:11; leading:4; } ";
 css += ".link { color:#000000; font-family:Inconsolata; font-size:11; leading:4; text-decoration:underline; } ";
 css += "a:hover { text-decoration:none; } ";
 ss.parseCSS(css);
 var fechahtml:String = "<span class='date'>";
 if (data.mes != null && data.dia != null) {
         fechahtml += data.dia + " " + StringUtils.month2name(data.mes) + " " + data.anotext;
 } else if (data.mes != null) {
         fechahtml += StringUtils.month2name(data.mes) + " " + data.anotext;
 } else {
         fechahtml += data.anotext;
 }
 fechahtml += "</span>";
 date_txt = new TextField();
 date_txt.width = 275;
 date_txt.embedFonts = true;
 date_txt.antiAliasType = "advanced";
 date_txt.styleSheet = ss;
 date_txt.htmlText = fechahtml;
 date_txt.x = 8;
 date_txt.y = 3;

 addChild(date_txt);

任何帮助都将不胜感激。我真的不知道该怎么办。
谢谢。

顺便说一下,这个网站非常棒! - George Profenza
正在努力添加大量的内容,请等待。谢谢! - mga
我想我找到了合适的字体 :) - George Profenza
伙计...Twitter应该这样显示它的动态!:D非常不错的时间轴概念。 - chamberlainpi
@bigp 谢谢 :) 既然你提到了,我现在可以做这件事... 嗯... - mga
3个回答

3
字体嵌入是我在创建flash时最讨厌的问题之一。但我找到了一种方法来减少墙上的洞(和头上的包)。
  1. 将字体嵌入库中
  2. 将字体符号(在库中)链接到扩展Font类的自定义类(暂称为MyFont
  3. 创建一个TextFormat对象(我们现在称其为frmt
  4. 设置frmt.font = new MyFont().fontName
  5. 创建一个TextField(我们称其为tf
  6. 分配tf.embedFonts = truetf.defaultTextFormat = frmt
希望这有所帮助。

注意,如果您想使用的字体是粗体,则需要设置frmt.bold = true。我刚刚花了好20分钟纠结为什么我的字体没有显示出来。该死的Flash字体问题! 摇拳头 - Steven Mercatante
1
我的字体对象的fontName、fontStyle和fontType属性都为“null”。该字体已嵌入,导出为ActionScript,但调用“new MyFont()”时跟踪到的对象为“[object MyFont]”。为什么这些属性会为空?当我将文本字段设置为嵌入字体时,该字体没有显示出来。 - Triynko
@Triynko,你是否在MyFont中扩展了Font类?(我不确定你是否真的需要创建源代码文件,但我总是这样做。)另外,我已经超过两年没有做任何闪存工作了,所以可能不是最适合帮助你的人。 - nikc.org

1

我曾经遇到过类似的问题,即在启用HTML的动态文本字段中,Arial Regular无法显示由AS中的html标签指定的粗体文本。

将字体更改为Lucida Sans后,一切都正常了。


0

我稍后会看一下。

这听起来有些熟悉。之前在开发多语言网站时,我也遇到了字符在swf静态文本字段中未显示的问题,尽管在IDE( flash cs3)中显示正常。那次问题出在Arial字体的希腊字符上。我不得不下载 带有正确希腊字符的Arial单独版本才解决了它。

也许这是相同的问题,你需要一个不同版本的同一字体。

你尝试过使用Courier NewLucida Console吗?我尝试了一个基本设置(将Tōru Iwatani名称写成2个文本字段,一个Courier New,一个Lucida Console,嵌入式字体,动态文本,旋转文本字段,仅为测试嵌入式字体),显示良好。


编辑:

您好,

我使用了dafont.com上的等宽字体进行了一些测试。

以下是我使用的代码片段,用于查找应该适用的字体:

var fonts:Array = Font.enumerateFonts();
for(var i:int = 0 ; i < fonts.length; i++){
    if(fonts[i].hasGlyphs('ō')) trace(fonts[i].fontName);
}

这是我得到的列表:
Monaco
Lucida Grande
Bitstream Vera Sans Mono
saxMono
JackInput
Liberation Mono Regular
F25 Bank Printer

我尝试了两种不同的方法。

将字体嵌入库中并没有帮助,如您所见:

library embed

使用舞台上的实例嵌入字体对一些字体有效:

stage embed

这是我用来测试的代码,相当混乱但它只是个测试 :)

l.text = j.text = f.text = li.text = s.text = b.text = 'Hello Tōru Iwatani...Hello Tōru Iwatani...Hello Tōru Iwatani...';

var lucida:TextField = getStyledTextField("Lucida Grande");
var liberation:TextField = getStyledTextField("Liberation Mono Regular");
var sax:TextField = getStyledTextField("saxMono");
addChild(lucida);
addChild(liberation);
addChild(sax);
liberation.y = 30;
sax.y = 60; 
lucida.htmlText= liberation.htmlText = sax.htmlText = "<body><span class='text'>Hello Tōru Iwatani...</span></body>";

function getTextField(font:String):TextField{
    var label:TextField = new TextField();
    label.defaultTextFormat = new TextFormat(font,11,0x33333);
    label.autoSize = TextFieldAutoSize.LEFT;
    label.border = true;
    label.embedFonts = true;
    return label;
}

function getStyledTextField(font:String):TextField{
    var style:StyleSheet = new StyleSheet();
    style.parseCSS(".text { color:#333333; font-family:"+font+";  }");
    var label:TextField = new TextField();
    label.styleSheet = style;
    label.autoSize = TextFieldAutoSize.LEFT;
    label.border = true;
    label.embedFonts = true;
    return label;
}

l、li、b、j等是舞台上使用像lucida grande、liberation、bitstream vera sans mono、JackInput等字体的动态文本字段的实例名称。

我不确定问题是什么,但是在舞台上嵌入字符对我有用,而且我嵌入了所有字形以确保。编译需要很长时间,您可能想从那些可用的字体中选择一个喜欢的字体,并逐渐删除字形,直到找到所需的最小字形数量。

祝好运, 乔治


嗯...我尝试过使用DejaVu字体http://dejavu-fonts.org/wiki/index.php?title=Main_Page,但是效果并不理想...也许有人知道如何正确地嵌入字体,以便我可以按照代码要求通过CSS使用它(或者有更好的替代方案)...更改字体可能需要一些微调,所以我宁愿等待一个好的替代方案。 - mga
你认为这是字体的问题吗?我已经放置了一个文本字段并选择了“嵌入整个东西 ftw”(实际上左上角的文本字段和几乎所有其他文本字段都有)但没有效果。我会尝试你的方法并告诉你结果。你认为这会对动态和静态文本字段有帮助吗?动态文本字段往往会在按钮中弄乱“手形”鼠标光标(这就是为什么你在顶部按钮中看不到手形光标...必须将这些文本转换为动态,否则字体将无法嵌入)...非常感谢。 - mga
如果我有机会,我会再次测试您的原始字体,我忘记为什么选择其他字体了。奇怪的是,尽管所有等宽字体都应该具有“ō”字符,但并非所有字体都显示该字符。唯一有效的嵌入是在舞台上动态文本字段中进行的。关于“手形鼠标指针”的问题,这是否与.selectable属性有关?顺便说一下,我已经上传了我的测试fla和swf文件:http://lifesine.eu/so/css_font_embed.zip,字体在这里:http://lifesine.eu/so/monospaced_fonts.zip。 - George Profenza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接