我有一个项目使用flash(和AIR for android和eventuall iOS)来翻译一些短语。虽然大多数字体都很好,但是在用户选择语言后我必须加载一些字体。一年多以前,我生成了几个swf文件(孟加拉语和乌尔都语)并将它们放在我的网络服务器上。然后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 ok但是然后无法提取类。使用我在swf类之前嵌入的两种字体和参数都具有相同的名称并且它们工作正常(即
Urdu.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"));
但都返回false
PS也尝试使用fontswf.bat生成Arabic.swf,这似乎又创建了一个非常相似的swf文件,但是我无法从中提取类
PPS我正在使用flashdevelop,字体swf被设置为AS3标准项目编译器选项。
答案 0 :(得分:2)
我不使用Flash Develop,但也许我可以从我的实现中提供一些观点。
如果我想嵌入Arial,嵌入式swf将“Export for ActionScript”嵌入字体。在其文档类中,使用registerFont()
,如下所示:
Font.registerFont(Arial);
与所有其他swf一样,您使用Loader
将其导入运行时,此时,该字体将可用于您的全局表。您可以使用enumerateFonts()查询已注册字体的完整列表。
var fontList:Array = Font.enumerateFonts();
for (var i:int = 0; i < fontList.length; i++) {
trace(fontList[i].fontName);
}
假设我们有一个名为“txt”的TextField,您可以使用setTextFormat()
实现该字体,如下所示:
var format:TextFormat = new TextFormat();
format.font = "Arial";
txt.embedFonts = true;
txt.antiAliasType = AntiAliasType.ADVANCED;
txt.setTextFormat(format);
txt.defaultTextFormat = format;
Adobe就使用这些last two settings:
的免责声明“使用。将TextFormat对象应用于文本字段时 TextField.defaultTextFormat属性或TextField.setTextFormat() 方法,仅应用其定义的属性。使用 TextField.defaultTextFormat属性在您之前应用格式 将文本添加到TextField,以及要添加的setTextFormat()方法 将文本添加到TextField后格式化。“
正如我之前所说,我的工作流程不使用Flash Develop,而是使用Flash IDE将字体嵌入到swfs中。您的结果可能会有所不同,但请注意,您必须将embedFonts
设置为true,否则它将不会响应您的嵌入字体。我以前在那个问题上失去了头发。
希望有所帮助。欢呼声,
答案 1 :(得分:1)
OK如果其他人遇到类似的问题,这是答案的第一阶段(真的是我原来的问题的答案)仍然需要弄清楚如何在flash.font.engine设备中使用该字体!
关键部分是:
第1点。嵌入字体swf必须具有不与调用脚本中注册的任何名称冲突的名称。 Bizzare和(据我可以搜索)没有证件。即我有一个通过xml服务上传到xml对象的语言列表,其中包括例如'English'但是在我将可加载字体文件变为'EnglishF.swf'之前字体加载不起作用' English.swf'失败了。所以我的嵌入式字体源现在称为EnglishF.swf,并显示为:
package
{
import flash.display.Sprite;
import flash.text.Font;
import flash.system.Security;
Security.allowDomain("*");
/**
* ...
* @author patrick
*/
public class EnglishF extends Sprite
{
[Embed(source = "Kingthings Exeter.ttf",
fontName = "EnglishF",
fontFamily = "EnglishF",
fontWeight = "normal",
fontStyle = "normal",
mimeType = "application/x-font",
advancedAntiAliasing="true",
embedAsCFF="true")]
public static var myFont:Class;
}
}
并使用脚本:
private function fontLoaded(evt:Event):void {
var FontClass:Class
if (evt.target.applicationDomain.hasDefinition(font1Name)) FontClass = evt.target.applicationDomain.getDefinition(font1Name) as Class;
else if (evt.target.applicationDomain.hasDefinition(font2Name)) FontClass = evt.target.applicationDomain.getDefinition(font2Name) as Class;
try {
Font.registerFont(FontClass.myFont);
trace("successfully loaded " + FontClass);
} catch (err:Error) {
trace("couldn't register font "+FontClass.myFont+" =>"+err);
}
}
嵌入式脚本中关于安全性的一行是因为第2点:registerFont不能跨域工作。实际上Security.allowDomain()不起作用并调试它我必须在PC上复制/粘贴swf文件并相应地更改loader.load(URLRequest())
仍然存在一个问题,即虽然字体已注册并声称与flash.text.engine TextElement要求兼容,但它仍然无法用作:
_tl = new Array();
var block:TextBlock = new TextBlock();
var font:FontDescription = new FontDescription(fontName);
var formt:ElementFormat = new ElementFormat(font, fontSize);
//following gives 'true EnglishF'
trace(FontDescription.isFontCompatible(fontName,"normal","normal"), formt.fontDescription.fontName);
formt.color = colr;
var span:TextElement = new TextElement(text, formt);
block.content = span;
_tl[0] = null;
_tl[0] = block.createTextLine(null, width);
var tl:TextLine;
// after here justification and addition lines
如果我理清为什么这不起作用,我会发布一些东西(除非有些人为我做这件事!)