我正在为我的项目使用Flash CS5(资产)和FlashDevelop(代码)。我们有大约20个包含文本字段的fla / swf。我们所有的文本字段都使用相同的字体,字体特定于我们公司,因此不会安装在任何计算机上,因此需要嵌入。
我的最终目标是嵌入一个所有文本字段使用的单一字体,主要有两个原因:
我在努力实现这一目标时遇到了很大困难。似乎我尝试的所有内容都缺少了字符(只有在每个fla中文本字段的text属性中输入的字符才会被嵌入)。
我正在尝试的最新解决方案是使用运行时共享库,因为它似乎应该可以工作。我有一个名为FNFont.fla的fla。它只包含库中的一个对象,即嵌入字体。该字体将导出到AS3,在第1帧中导出并导出以供运行时共享。 URL是FNFont.swf(所有swf都在同一个文件夹中)。
在所有其他fla中,我在字体嵌入中创建了字体对象。我勾选导入运行时共享,并给它与FNFont.fla中的类名相同。 URL是FNFont.swf。 fla(s)包含许多使用此字体的文本字段。文本字段中有自己的实例作为其他动画片段的子项。
当我运行程序并尝试加载包含其中一个文本字段实例的动画片段时,我收到错误:
[Fault] exception, information=ReferenceError: Error #1065: Variable FontName is not defined.
FontName是FNFont.fla中Font对象的类名和所有其他fla。它不是textfield的实例名称(也不是类名),所以我不明白它是如何认为它是一个变量。有人能够对此有所了解吗?
由于
答案 0 :(得分:1)
根据我的经验,您需要动态创建新的TextFields
。
您无法使用已在TextFields
中编译的SWF
,否则您会遇到上述问题。
这是一个让人很难爱Adobe的小错误之一。
答案 1 :(得分:0)
您可能想要搜索“运行时字体加载”,例如:
http://www.mokisystems.com/blog/flash-as3-loading-fonts/
...或
http://nochump.com/blog/archives/20
创建字体资源SWF:
package {
import flash.display.Sprite;
public class FontLibrary extends Sprite {
[Embed(systemFont='Bank Gothic', fontName='emBank Gothic', mimeType='application/x-font')]
public static var BankGothicFont:Class;
}
}
从您的应用加载并注册SWF:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.load(new URLRequest("fontlibrary.swf"));
private function completeHandler(event:Event):void {
var FontLibrary:Class = event.target.applicationDomain.getDefinition("FontLibrary") as Class;
Font.registerFont(FontLibrary.BankGothicFont);
var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat("emBank Gothic", 12, 0);
tf.embedFonts = true;
tf.rotation = 15; // to demonstrate the embed worked
tf.text = "blah blah blahnblah blah blahnblah blah blah ";
addChild(tf);
}
答案 2 :(得分:0)
前一段时间我遇到了类似的问题,结果证明在加载程序中设置正确的ApplicationDomain
是一个问题。
我不确定你是否有类似的情况,但这是我的。
fonts.swf
。它们每个都设置为Export for Runtime Sharing,并且它们被赋予了类名。在我的情况下,第一个子swf会正确加载fonts.swf并访问字体。尝试访问字体的第二个子swf 不重新加载fonts.swf,我会得到你在上面描述的相同错误。
在我看来,Flash正在尝试不重新加载字体,因为它假设它们已经注册了整个应用程序。但是,由于每个child.swf都使用默认的ApplicationDomain
加载到父级,因此子级可以访问父级的类路径,但不能相互访问。因此,第一个孩子可以访问fonts.swf
中的字体,但第二个孩子没有,因为他们是兄弟姐妹,而不是父母。
我相信有两种解决方法:
ApplicationDomain
设置为ApplicationDomain.currentDomain
,以便子swfs与主要父swf共享相同的ApplicationDomain。我选择了选项2,它为我解决了问题。
var context : LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
var clipLoader:Loader = new Loader();
clipLoader.load(url, context);