Actionscript 3 使用as3在swf中嵌入字体
我有一个项目使用flash(android和eventuall iOS的AIR)翻译一些短语。虽然大多数字体都很好,但在用户选择语言后,我必须加载一些字体。一年多前,我生成了两个swf文件(孟加拉语和乌尔都语),并将它们放在我的web服务器上。flash应用程序然后在需要时加载它们,一切正常。。。 然而,当我即将实现这个项目时,我想我应该为其他语言生成swf文件,因为某些原因,我无法管理它!不用说,我已经错放(整理)了我所做的两种字体的原始AS3源代码Actionscript 3 使用as3在swf中嵌入字体,actionscript-3,fonts,embed,Actionscript 3,Fonts,Embed,我有一个项目使用flash(android和eventuall iOS的AIR)翻译一些短语。虽然大多数字体都很好,但在用户选择语言后,我必须加载一些字体。一年多前,我生成了两个swf文件(孟加拉语和乌尔都语),并将它们放在我的web服务器上。flash应用程序然后在需要时加载它们,一切正常。。。 然而,当我即将实现这个项目时,我想我应该为其他语言生成swf文件,因为某些原因,我无法管理它!不用说,我已经错放(整理)了我所做的两种字体的原始AS3源代码 package { im
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类和参数之前嵌入的两种字体都具有相同的名称,它们工作正常(即。
乌尔都语
随后:
var FontClass:Class=evt.target.applicationDomain.getDefinition(“Urdu”)作为类;
然后
Font.registerFont(FontClass.Urdu);在calling.as应用程序中,我尝试使用上述阿拉伯语.swf
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被设置为3个标准项目编译器选项。我不使用flashdevelop,但也许我可以从我的实现中提供一些观点
如果我想嵌入Arial,嵌入swf将“导出ActionScript”嵌入字体。在其文档类中,使用如下:
Font.registerFont(Arial);
与其他所有swf一样,您将使用导入到运行时,此时,字体将可用于全局表。您可以使用查询已注册字体的完整列表
Adobe关于使用以下内容的免责声明:
“当您使用
TextField.defaultTextFormat属性或TextField.setTextFormat()
方法,仅应用其定义的属性
TextField.defaultTextFormat属性,以便在
将文本添加到TextField,并使用setTextFormat()方法添加
将文本添加到文本字段后的格式设置。“
正如我之前所说,我的工作流程没有使用Flash Develop,而是使用Flash IDE将字体嵌入到SWF中。您的结果可能会有所不同,但请注意,您必须将embeddeFonts
设置为true,否则它将不会响应您的嵌入字体。我以前在这个问题上发过言
希望有帮助。干杯,我不使用Flash Develop,但也许我可以从我的实现中提供一些观点
如果我想嵌入Arial,嵌入swf将“导出ActionScript”嵌入字体。在其文档类中,使用如下:
Font.registerFont(Arial);
与其他所有swf一样,您将使用导入到运行时,此时,字体将可用于全局表。您可以使用查询已注册字体的完整列表
Adobe关于使用以下内容的免责声明:
“当您使用
TextField.defaultTextFormat属性或TextField.setTextFormat()
方法,仅应用其定义的属性
TextField.defaultTextFormat属性,以便在
将文本添加到TextField,并使用setTextFormat()方法添加
将文本添加到文本字段后的格式设置。“
正如我之前所说,我的工作流程没有使用Flash Develop,而是使用Flash IDE将字体嵌入到SWF中。您的结果可能会有所不同,但请注意,您必须将embeddeFonts
设置为true,否则它将不会响应您的嵌入字体。我以前在这个问题上发过言
希望有帮助。干杯,好的,以防其他人遇到类似的问题这是第一阶段的答案(实际上是我原来问题的答案)仍然需要解决如何在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
如果我弄清楚为什么这不起作用(除非有人帮我做!),我会发布一些东西。好的,如果其他人遇到类似的问题,这是第一阶段的答案(实际上是我原来问题的答案),但我仍然要弄清楚如何在flash.font.engine设备中使用字体 关键部分包括: 要点#1.嵌入字体swf的名称必须与调用脚本中注册的任何名称不冲突。Bizzare和(据我所能搜索)未记录。即,我有一个通过xml服务上传到xml对象的语言列表,其中包括例如“English”,但是字体加载不起作用,直到我将可加载的字体文件设置为“EnglishF.swf”时,字体加载才起作用
_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