首页 > 设计 > WEB开发 > 正文

9.12.从SWF文件中嵌入字体

2023-07-29 15:25:40
字体:
来源:转载
供稿:网友
9.12.1.问题
你想从SWF 文件中嵌入字体,并将其应用在你的程序中。
9.12.2.解决办法
生成一个嵌有字体的SWF ,然后利用@font-face 指令声明你想在程序中嵌入的打印机字体。
9.12.3.讨论
你能从单个包含嵌入字体的SWF 文件中为你的程序嵌入多种打印机字体样式。与从字体文件中嵌入字体相反,从SWF 中嵌入的方法具有可携带性的优势。你能将你系统中可用的字体嵌入进SWF 文件,然后传给其他开发人员,他们不再需要担心编译时是否内在地包含相应的字体。

想要在SWF 文件中嵌入字体,首先在Flash IDE 中生成新的FLA 文件,然后向舞台中添加带有指定的打印机字体集的动态文本域,并选择待嵌入的字符范围(图9-1).
图9-1.添加动态文本域并嵌入字体范围。

本例中,每个动态文本域都添加了Verdana 字体并选择了打印机字体属性。正如你能看到的,粗斜体样式是从属性面板中获取的。通过选择面板中的Embed 按钮, 你能明确字符范围以减小文件尺寸。找一个符合你的项目名称保存该FLA 文件(本例中该文件命名为Verdana.fla) 然后发布剪辑。

声明SWF 文件中嵌入的字体和声明字体文件中字体的方法相似。若要从SWF 文件中嵌入字体,不用通过url 函数定义字体文件位置或者通过local 函数定义字体名称,你只要利用url 指令指明SWF 文件的位置。方法如下:
+展开
-CSS
@font-face {
src: url("styles/fonts/Verdana.swf");
font-family: Verdana;
}

/*设置粗体以及斜体:*/
@font-face {
src: url("styles/fonts/Verdana.swf");
font-family: Verdana;
font-weight: bold;
font-style: italic;
}

嵌入的字体是ActionScript API 中flash.text.Font 的子类。你能通过Font 类的enumerateFonts静态方法访问一系列设备和嵌入的字体。enumerateFonts 的参数是一个标记用来判断返回数组中是否包括设备字体。下面的例子利用嵌入的字体填充数据单元,这些字体嵌入在<mx:Style>标记中声明的字体SWF 文件中:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxmllayout="verticalcreationComplete="creationHandler();">
<mx:Style>
@font-face
{
src: url("assets/fonts/Verdana.swf");
font-family: Verdana;
}

@font-face
{
src: url("assets/fonts/Verdana.swf");
font-family: Verdana;
font-weight: bold;
}

@font-face
{
src: url("assets/fonts/Verdana.swf");
font-family: Verdana;
font-style: italic;
}

@font-face
{
src: url("assets/fonts/Verdana.swf");
font-family: Verdana;
font-weight: bold;
font-style: italic;
}

Label {
font-family: Verdana;
font-size: 15px;
}

.verdanaBoldStyle {
font-weight: bold;
}

.verdanaItalicStyle {
font-style: italic;
}

.verdanaBoldItalicStyle {
font-weight: bold;
font-style: italic;
}

</mx:Style>
<mx:Script>
<![CDATA[
[Bindable]
 private var fontArray:Array;
[Bindable]
 private var selectedFontStyle:String;
[Bindable]
private var selectedFontWeight:String;
private function creationHandler():void {
var embeddedFonts:Array = Font.enumerateFonts();
embeddedFonts.sortOn( "fontStyle",Array.CASEINSENSITIVE );
fontArray = embeddedFonts;
}
private function changeHandler():void {
var italic:RegExp = /italic/i;
var bold:RegExp = /bold/i;
selectedFontStyle =( String( fontGrid.selectedItem.fontStyle).match(italic) )?'italic''normal';
selectedFontWeight =( String( fontGrid.selectedItem.fontStyle).match(bold) )? 'bold''normal';
}

]]>
</mx:Script>
<mx:Label text="Select a font form the grid below:" />
<mx:DataGrid id="fontGriddataProvider="{fontArray}change="changeHandler();">
<mx:columns>
<mx:DataGridColumn headerText="Font NamedataField="fontNamewidth="150" />
<mx:DataGridColumn headerText="Font StyledataField="fontStyle" />
<mx:DataGridColumn headerText="Font TypedataField="fontType" />
</mx:columns>
</mx:DataGrid>
<mx:Label width="100%textAlign="centertext="{fontGrid.selectedItem.fontName + ' :+fontGrid.selectedItem.fontStyle}fontFamily="{fontGrid.selectedItem.fontName}"
fontStyle="{selectedFontStyle}fontWeight="{selectedFontWeight}"/>

</mx:Application>

creationComplete 事件处理器访问程序中的嵌入字体数组,然后更新用作DataGrid 实例的dataProvider 的可绑定的fontArray 成员。一旦从数据格子中选择打印机字体,标签的字体样式属性在运行时就会更新。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表