Flash能否检测缺失的嵌入式字体和/或替换为可用字体?

Flash能否检测缺失的嵌入式字体和/或替换为可用字体?,flash,fonts,actionscript-2,Flash,Fonts,Actionscript 2,编辑的短版本: 在文本区域中列出属性embedFonts: 一个布尔值,指示是否 fontFamily中指定的字体是 嵌入式字体。必须设置此样式 如果fontFamily引用 嵌入式字体。否则,嵌入式 不使用字体。如果设置了此样式 “为true”和“fontFamily”不指 对于嵌入式字体,不显示任何文本 显示。默认值为false 关于“如果此样式设置为true,并且fontFamily未引用嵌入字体,则不会显示任何文本”语句:当出现这种情况时,如何在ActionScript中检测 TL;DR

编辑的短版本:

在文本区域中列出属性
embedFonts

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

关于“如果此样式设置为true,并且fontFamily未引用嵌入字体,则不会显示任何文本”语句:当出现这种情况时,如何在ActionScript中检测

TL;DR原始版本:

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

textBoxName.embedFonts = true;
但是,有时加载的外部
.swf
文件中不可用所请求的字体,这通常发生在有人更改外部
.swf
时,并且不包括以前在其中的所有字体

原因并不重要,重要的是这是不可避免的,而且会发生。当它出现时,字体中任何不可用的文本都不会显示。例如:

  • 主应用程序设置为使用“Myriad”。它正在加载一个外部的
    swf
    文件,该文件包含无数种字体和其他一些字体
  • 一段时间后,外部
    swf
    被更新为包含一组新字体,Myriad不再是其中之一。但是主应用程序没有更新
  • 现在,“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);
    
    //字体加载程序:
    var loadedFonts=Array();
    var fontPakLoadHandler=新对象();
    fontPakLoadHandler.percent=0;
    fontPakLoadHandler.onLoadStart=函数(目标:MovieClip)
    {
    如果(!吊杆)
    调用(“fontLoadStart”,_root.lcId);
    }
    fontPakLoadHandler.onLoadInit=函数(目标:MovieClip)
    {
    如果(!吊杆)
    调用(“fontLoadInit”,_root.lcId);
    }
    fontPakLoadHandler.onLoadError=函数(目标:MovieClip,错误代码:String,httpStatus:Number)
    {
    如果(!吊杆)
    调用(“fontLoadError”,_root.lcId,errorCode,httpStatus);
    }
    如果(_root.fontPakProgress=='all')
    {
    fontPakLoadHandler.onLoadProgress=函数(目标:MovieClip,loadedBytes:Number,totalBytes:Number)
    {
    fontPakLoadHandler.percent=loadedBytes/totalBytes;
    如果(!吊杆)
    调用(“fontLoadProgress”,_root.lcId,loadedBytes,totalBytes,fontPakLoadHandler.percent);
    }
    }
    其他的
    {
    fontPakLoadHandler.onLoadProgress=函数(目标:MovieClip,loadedBytes:Number,totalBytes:Number)
    {
    var perc=loadedBytes/totalBytes;
    如果((fontPakLoadHandler.percent<.75&&perc>=.75)||
    (fontPakLoadHandler.percent<.50&&perc>=.50)||
    (fontPakLoadHandler.percent<.25&&perc>=.25))
    {
    如果(!吊杆)
    调用(“fontLoadProgress”,_root.lcId,loadedBytes,totalBytes,perc);
    }
    fontPakLoadHandler.percent=perc;
    }
    }
    fontPakLoadHandler.onLoadComplete=函数(目标:MovieClip,httpStatus:编号)
    {
    如果(!吊杆)
    调用(“flashReady”,_root.lcId,true);
    //调用(“fontLoadComplete”,_root.lcId,httpStatus);
    }
    var fontPakLoader=新的MovieClipLoader();
    addListener(fontPakLoadHandler);
    
    不幸的是,无法在ActionScript 2中列出所有可用的嵌入式字体,就像ActionScript 3中的Font.enumerateFonts()一样。您只能通过TextField.getFontList()获取安装在用户计算机上的字体列表

    但是,您可以手动提供可用字体名称的列表(可能是xml格式),并将其加载到主SWF中。然后,您可以在每次使用嵌入字体时将字体名称与此列表进行比较,并替换默认字体,甚至在所需字体不可用时使用替换映射


    它不像自动从内容中获取完整列表那样优雅,但它应该可以做到这一点,而不必重新编译主应用程序

    对不起,我刚看到你在AS2。忘了我说了什么吧,我会尽量给你一个有帮助的回答;)好的,我相应地修改了答案。谢谢。问题是,有时文本字段的文本是通过
    html
    属性设置的。。。那么,我是否需要使用HTML解析器来提取正在使用的字体?我想我希望有一个更简单的方法。。。但有一种可能根本不存在:-)如果你不能影响文本的结构,那么我恐怕不行。您可以尝试让所有字体信息来自样式表,并解析css。这应该简单得多。或者,如果您知道加载的SWF可能会使用哪一组字体,您也可以为这些字体编写一个列表,并使用string.indexOf(fontName)查找每个字体。