【发布时间】:2012-09-27 15:05:39
【问题描述】:
我有一个项目使用 flash(以及 AIR for android 和最终的 iOS)来翻译一些短语。虽然大多数字体都很好,但在用户选择语言后我必须加载一些字体。一年多以前,我生成了几个 swf 文件(孟加拉语和乌尔都语)并将它们放在我的 Web 服务器上。然后,Flash 应用程序会在需要时加载它们,一切正常...... 然而,当我接近实施该项目时,我认为我应该为管道中的其他语言生成 swf 文件,但由于某种原因我无法管理它!不用说,我已经放错了(整理)我所做的两种字体的原始 AS3 源代码。
package
{
import flash.display.Sprite;
import flash.events.Event;
public class ArabicF extends Sprite
{
[Embed(source = "trado.ttf",
fontName = "ArabicX",
fontFamily = "ArabicY",
fontWeight = "normal",
fontStyle = "normal",
mimeType = "application/x-font",
advancedAntiAliasing="true",
embedAsCFF="true")]
public static const ArabicZ:Class;
}
}
这已经从一个更简单的形式扩展,因为我添加了一些东西来让它工作,我必须尝试所有真假排列。我加载 swf 正常,但无法提取类。我在 swf 类和参数之前嵌入的两种字体都具有相同的名称并且它们工作正常(即
乌尔都语.swf
然后稍后:
var FontClass:Class = evt.target.applicationDomain.getDefinition("Urdu") as Class;
然后
Font.registerFont(FontClass.Urdu);
在使用上述 Arabic.swf 调用 .as 应用程序中我尝试
trace("1 Arabic "+evt.target.applicationDomain.hasDefinition("ArabicF"));
trace("2 Arabic "+evt.target.applicationDomain.hasDefinition("Arabic"));
trace("3 ArabicX "+evt.target.applicationDomain.hasDefinition("ArabicX"));
trace("4 ArabicY "+evt.target.applicationDomain.hasDefinition("ArabicY"));
trace("5 ArabicZ "+evt.target.applicationDomain.hasDefinition("ArabicZ"));
但都返回假
PS 还尝试使用 fontswf.bat 生成 Arabic.swf,这似乎再次生成了一个非常相似的 swf 文件,但我无法从中提取类
PPS 我使用的是 flashdevelop,字体 swf 设置为 AS3 标准项目编译器选项。
【问题讨论】:
-
有几种方法可以调试此类问题。首先,您可以检查该类是否实际导出到 SWF 文件中(使用
link-report.xml或 SWF Investigator (labs.adobe.com/technologies/swfinvestigator) 之类的工具。然后,您可以看到,一旦加载了字体库 SWF,@987654325 @ 给你。问题是,我不确定你嵌入字体的方式创建的类定义与你给的名字完全匹配。 -
安托万。非常感谢指向 swfinvestigator 的指针,它似乎是 A1,毫无疑问会帮助我解决这个问题。目前,我发现我现在制作的 swf 和一年前制作的 swf 几乎没有任何区别。在我将目标从 flash 10 更改为 flash 9 后,它们非常接近。旧的包含额外的标签DefineFontName,并具有DefineFont3,而新的具有DefineFont4。它当然看起来包含类 ArabicF 和 ArabicF_ArabicZ,所以我认为即使字体有问题 getDefinition() 也会起作用!
标签: actionscript-3 fonts embed