使用as3在swf中嵌入字体

时间:2012-10-06 20:21:33

标签: actionscript-3 fonts embed

我有一个项目使用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标准项目编译器选项。

2 个答案:

答案 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;

Adob​​e就使用这些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  

如果我理清为什么这不起作用,我会发布一些东西(除非有些人为我做这件事!)