编辑短版:
Adobe Flash docs在TextAreas上列出属性embedFonts
:
一个布尔值,指示是否 fontFamily中指定的字体是 嵌入字体。必须设置此样式 如果fontFamily引用,则返回true 嵌入字体。否则,嵌入式 字体未使用。如果设置了此样式 为true并且fontFamily没有引用 嵌入字体,没有文字 显示。默认值为false。
关于“如果此样式设置为true且fontFamily未引用嵌入字体,则不显示任何文本”声明:如果在此情况发生时如何在ActionScript中检测到?
TL; DR原始版本:
我有一个flash应用程序,它加载包含嵌入字体的外部.swf
文件,以便这些字体可以在主应用程序中使用。我们通过在使用自定义字体的任何内容上使用以下ActionScript代码来实现此目的:
textBoxName.embedFonts = true;
但是,有时所请求的字体在加载的外部.swf
文件中不可用 - 当有人对外部.swf
进行更改并且不包括所有字体时,通常会发生这种情况。以前在那里...
原因并不重要,重要的是它是不可避免的,并且会发生。如果是这样,字体中任何不可用的文本都根本不显示。例如:
swf
文件,其中包含Myriad以及一些其他字体swf
更新为包含一组新字体,而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);
答案 0 :(得分:2)
不幸的是,没有办法在ActionScript 2中列出所有可用的嵌入字体,就像ActionScript 3中的Font.enumerateFonts()一样。您只能通过TextField获取用户计算机上安装的字体列表.getFontList()。
但是,您可以手动提供可用字体名称列表(可能以xml格式)并将其加载到主SWF中。然后,您可以在每次使用嵌入字体时将字体名称与此列表进行比较,并替换默认字体,甚至使用替换映射(如果所需的字体不可用)。
它不如从内容中自动获取完整列表那么优雅,但它应该可以完成这一操作,而无需重新编译主应用程序。