Flash能检测缺失的嵌入字体并替换为可用字体吗?

4

编辑简版:

Adobe Flash文档列出了TextArea上的一个属性embedFonts

一个布尔值,指示fontFamily中指定的字体是否为嵌入式字体。如果fontFamily引用了嵌入式字体,则必须将此样式设置为true。否则,不使用嵌入式字体。如果将此样式设置为true且fontFamily未引用嵌入式字体,则不显示任何文本。默认值为false。

关于“如果将此样式设置为true且fontFamily未引用嵌入式字体,则不显示任何文本”的说法:我该如何在ActionScript中检测到这种情况?

TL;DR 原始版本:

我有一个Flash应用程序,它加载包含嵌入字体的外部.swf文件,以便这些字体可以在主应用程序中使用。我们通过对使用自定义字体的任何内容使用以下ActionScript代码来实现此目的:

textBoxName.embedFonts = true;

然而,有时在加载外部的.swf文件时,请求的字体不可用--这经常发生在某人更改了外部的.swf文件并没有包含先前存在的所有字体时...无论原因如何都是不可避免的并且会发生。当发生时,任何一个不可用的字体中的文本都不会显示。例如:
1.主应用程序设置为使用"Myriad"。它正在加载一个包含Myriad以及其他几种字体的外部swf文件 2.过了一段时间,外部swf被更新为包含新的字体集,并且Myriad不再是其中之一。但是主应用程序没有更新。 3.现在,主应用程序中的所有" Myriad "文本都不再显示。
是否有任何方法可以将文本默认为可用的字体,或者检测到字体不可用并运行一些ActionScript代码?
编辑:如果重要的话,这里是我用来从外部swf文件加载字体的代码:
// Font Loader:
var loadedFonts = Array();
var fontPakLoadHandler = new Object();

fontPakLoadHandler.percent = 0;

fontPakLoadHandler.onLoadStart = function(target_mc:MovieClip)
{
    if(!SuspendEvents)
        ExternalInterface.call("fontLoadStart", _root.lcId);
}

fontPakLoadHandler.onLoadInit = function(target_mc:MovieClip)
{
    if(!SuspendEvents)
        ExternalInterface.call("fontLoadInit", _root.lcId);
}

fontPakLoadHandler.onLoadError = function(target_mc:MovieClip, errorCode:String, httpStatus:Number)
{
    if(!SuspendEvents)
        ExternalInterface.call("fontLoadError", _root.lcId, errorCode, httpStatus);
}

if(_root.fontPakProgress=='all')
{
    fontPakLoadHandler.onLoadProgress = function(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number)
    {
        fontPakLoadHandler.percent = loadedBytes / totalBytes;
        if(!SuspendEvents)
            ExternalInterface.call("fontLoadProgress", _root.lcId, loadedBytes, totalBytes, fontPakLoadHandler.percent);
    }
}
else
{
    fontPakLoadHandler.onLoadProgress = function(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number)
    {
        var perc = loadedBytes / totalBytes;

        if( (fontPakLoadHandler.percent < .75 && perc >= .75) ||
            (fontPakLoadHandler.percent < .50 && perc >= .50) ||
            (fontPakLoadHandler.percent < .25 && perc >= .25))
        {
            if(!SuspendEvents)
                ExternalInterface.call("fontLoadProgress", _root.lcId, loadedBytes, totalBytes, perc);
        }

        fontPakLoadHandler.percent = perc;
    }
}

fontPakLoadHandler.onLoadComplete = function(target_mc:MovieClip, httpStatus:Number)
{
    if(!SuspendEvents)
        ExternalInterface.call("flashReady", _root.lcId, true);
    //ExternalInterface.call("fontLoadComplete", _root.lcId, httpStatus);
}

var fontPakLoader = new MovieClipLoader();
fontPakLoader.addListener(fontPakLoadHandler);
1个回答

2
很遗憾,ActionScript 2中没有像ActionScript 3中的Font.enumerateFonts()一样列出所有可用嵌入字体的方法。您只能通过TextField.getFontList()获取用户计算机上安装的字体列表。
不过,您可以手动提供可用字体名称列表(可能是xml格式),并将其加载到主SWF中。然后,每次使用嵌入式字体时,都可以将字体名称与此列表进行比较,并在所需字体不可用时替换为默认字体或甚至使用替换映射。
虽然这不如从内容自动获取完整列表那样优雅,但它可以在不必重新编译主应用程序的情况下完成任务。

抱歉,我刚看到你在使用AS2。就当我什么也没说,我会尽力回答并帮助你的 ;) - weltraumpirat
谢谢。问题是,有时通过“html”属性设置TextField的文本...所以,我需要使用HTML解析器来提取正在使用的字体吗?我想我希望有更简单的方法...但可能不存在 :-) - Josh
如果您无法影响文本的结构,那么恐怕不行。您可以尝试让所有字体信息都来自样式表并解析CSS。这应该会简单得多。 - weltraumpirat
谢谢@weltraumpirat。我刚刚修改了我的问题并创建了简短版本...有什么想法吗..? - Josh
参见定义:getTextRuns(beingIndex:int = 0, endIndex:int = int.MAX_VALUE):Array; getTextRuns会返回一个flash.text.TextRun对象数组。TextRun表示具有单一文本格式的文本连续段。换句话说,此函数按其格式解析TextField中的文本。您所要做的就是遍历返回的数组,以查看正在使用哪些字体。每个TextRun实例都包括beginIndex:int、endIndex:int和textFormat:TextFormat对象,因此您可以在那里检查字体并使用begin/end索引更新字体集合setTextFormat。 - Triynko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接