Actionscript 3 使用as3在swf中嵌入字体

Actionscript 3 使用as3在swf中嵌入字体,actionscript-3,fonts,embed,Actionscript 3,Fonts,Embed,我有一个项目使用flash(android和eventuall iOS的AIR)翻译一些短语。虽然大多数字体都很好,但在用户选择语言后,我必须加载一些字体。一年多前,我生成了两个swf文件(孟加拉语和乌尔都语),并将它们放在我的web服务器上。flash应用程序然后在需要时加载它们,一切正常。。。 然而,当我即将实现这个项目时,我想我应该为其他语言生成swf文件,因为某些原因,我无法管理它!不用说,我已经错放(整理)了我所做的两种字体的原始AS3源代码 package { im

我有一个项目使用flash(android和eventuall iOS的AIR)翻译一些短语。虽然大多数字体都很好,但在用户选择语言后,我必须加载一些字体。一年多前,我生成了两个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 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