首页 文章

Flash可以检测丢失的嵌入字体和/或替换为可用的字体吗?

提问于
浏览
4

Edited Short Version:

Adobe Flash docs在TextAreas上列出属性 embedFonts

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

关于“如果此样式设置为true且fontFamily未引用嵌入字体,则不显示任何文本”声明:如果在此情况发生时如何在ActionScript中检测到?

TL;DR Original Version:

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

textBoxName.embedFonts = true;

但是,有时所请求的字体在加载的外部 .swf 文件中不可用 - 这通常发生在有人对外部 .swf 进行更改并且不包括之前在那里的所有字体时......

原因并不重要,重要的是它是不可避免的,并且会发生 . 如果是这样,字体中任何不可用的文本都根本不显示 . 例如:

  • 主应用程序设置为使用"Myriad" . 它正在加载一个外部 swf 文件,其中包含Myriad以及一些其他字体

  • 一段时间后,外部 swf 是包含一组新字体的更新,而Myriad不再是其中之一 . 但主要应用程序未更新 .

  • 现在,"Myriad"中主应用程序中的所有文本都不再显示 .

有没有办法将文本默认为可用的字体,或者,检测字体不可用并运行一些ActionScript代码?

EDIT: 如果重要,这里's the code I' m用于从外部 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中 . 然后,您可以在每次使用嵌入字体时将字体名称与此列表进行比较,并替换默认字体,甚至使用替换映射(如果所需的字体不可用) .

    它不像从内容中自动获取完整列表那么优雅,但它应该可以完成这一操作,而无需重新编译主应用程序 .

相关问题