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
时,并且不包括以前在其中的所有字体
原因并不重要,重要的是这是不可避免的,而且会发生。当它出现时,字体中任何不可用的文本都不会显示。例如:
swf
文件,该文件包含无数种字体和其他一些字体swf
被更新为包含一组新字体,Myriad不再是其中之一。但是主应用程序没有更新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)查找每个字体。