如何在 AS3 中的 Tlf 中加载波斯文本文件?
How load Persian Text File in Tlf In AS3?
我有文本文件:file.txt:
1301,你好我的闪电
3001, سلام بر تو باد
在我的加载文本文件代码中是:
var url:URLRequest = new URLRequest("file.txt");
var n=Number;
var loader:URLLoader = new URLLoader();
loader.load(url);
loader.addEventListener(Event.COMPLETE, loaderComplete);
function loaderComplete(e:Event):void
{
tt.text=loader.data;
}
但我的结果是:
1301,你好我的闪电
3001, ÓáÇã ÈÑ Êæ ÈÇÏ
问题在于数据已正确加载(假设您的 .txt 文件已正确编码为 unicode 格式。使用记事本 ++ 执行此操作)但您的 TextField 无法呈现特殊的 unicode 文本、波斯语、阿拉伯语或希伯来语。
不幸的是,唯一可用的解决方案是利用 "TLFTextField" 组件,该组件存在于 flash cs5 中,但由于实施笨拙而在以后的版本中被删除。无论如何,虽然有点晚了,但我 post 在这里使用 tlf 的解决方案因为使用 tlf 正确呈现文本可能真的很痛苦,给你:
- 下载 "textLayout.swc" 和 "tlfruntime.swc"
- 将这些 SWC 添加到项目库中。
- 嵌入你的字体,其中包含你的 unicode 语言的符号(在这种情况下你首选的波斯语字体)这非常重要,因为不是每个目标机器都有这种字体,这足以避免获得抗锯齿文本,即使显示文本。
- 确保您从字体属性的 ActionScript 选项卡中选择了 FTE(DF4)
- 您必须实例化您的嵌入字体。在下面的代码中,我们已经做到了这一点。假设 embeddedFont 是嵌入字体的 class 名称。
- 使用以下函数将文本渲染成tlf(注意这不是用flash timeline写的代码,它是用单独的编辑器写的,由flex sdk编译):
</p>
<pre><code>import fl.text.TLFTextField;
import flash.text.AntiAliasType;
import flash.text.engine.FontLookup;
import flash.text.Font;
import flash.text.TextFieldAutoSize;
import flash.utils.getDefinitionByName;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.formats.TextAlign;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.formats.VerticalAlign;
private var _font:Font= new embeddedFont() as Font;
/**
* Creates a center registered TLFTextField with the given text
* @param text targer text
* @param layoutFormat an object containing layoutFormat data. something like { textIndent: 8, color: 0xAAAAAA, fontFamily: "tahoma", fontSize: 28, autoSize: "center", antiAliasType: "advanced" }
* @param width width of the TLFTextField, auto set if 0
* @param height height of the TLFTextField, auto set if 0
* @return a center registered TLFTextField with the given text
*/
public function text(text:String, layoutFormat:Object = null, width:int = 0, height:int = 0):TLFTextField
{
var _txt:TLFTextField = new TLFTextField();
var _layoutFormat:TextLayoutFormat = new TextLayoutFormat();
if (layoutFormat == null) layoutFormat = new Object();
// creating the textfield
if (width != 0) _txt.width = width;
if (height != 0) _txt.height = height;
_txt.selectable = false;
_txt.embedFonts = true;
_txt.multiline = true;
//if either width or height are 0(not passed to function) and the wordWrap is true, autoSize wont work and width or height will be 0
if (width != 0 && height != 0) _txt.wordWrap = true;
if (layoutFormat.backgroud != undefined) _txt.background = layoutFormat.backgroud;
if (layoutFormat.backgroundColor != undefined) _txt.backgroundColor = layoutFormat.backgroundColor;
_txt.autoSize = (layoutFormat.autoSize != undefined)?(layoutFormat.autoSize) : (TextFieldAutoSize.CENTER);
_txt.verticalAlign=(layoutFormat.verticalAlign != undefined)?(layoutFormat.verticalAlign) : (VerticalAlign.MIDDLE)
_txt.antiAliasType = (layoutFormat.antiAliasType != undefined)?(layoutFormat.antiAliasType) : (AntiAliasType.ADVANCED);
// creating layout format
_layoutFormat.textAlign = (layoutFormat.textAlign != undefined)?(layoutFormat.textAlign):(TextAlign.CENTER);
_layoutFormat.textIndent = (layoutFormat.textIndent != undefined)?(layoutFormat.textIndent) : (8);
_layoutFormat.fontLookup = FontLookup.EMBEDDED_CFF;
_layoutFormat.color = (layoutFormat.color != undefined)?(layoutFormat.color) : (0xFFFFFF);
_layoutFormat.fontFamily = (layoutFormat.fontFamily != undefined)?(layoutFormat.fontFamily) : (_font.fontName);
_layoutFormat.fontSize = (layoutFormat.fontSize != undefined)?(layoutFormat.fontSize) : (42);
//setting text flow, text and attaching layout format
var _textFlow:TextFlow = _txt.textFlow;
_textFlow.hostFormat = _layoutFormat;
_textFlow.flowComposer.updateAllControllers();
_txt.text = text;
return _txt;
}
- 使用此代码获取 TLFTextField 并将其添加到显示:
</p>
<pre><code>private var _tlf:TLFTextField = text("سلام", { textIndent: 8, color: 0xAAAAAA, fontSize: 28, autoSize: "center", antiAliasType: "advanced" } );
stage.addChild(_tlf);
请注意,根据我的经验,使用 RTL 语言创建 tlf 文本时会有 100 毫秒的延迟。确保您在正确的时间创建所有文本(当没有动画、音频或视频打开时),否则您会出现轻微的停顿,足以破坏您的用户体验。
我有文本文件:file.txt:
1301,你好我的闪电
3001, سلام بر تو باد
在我的加载文本文件代码中是:
var url:URLRequest = new URLRequest("file.txt");
var n=Number;
var loader:URLLoader = new URLLoader();
loader.load(url);
loader.addEventListener(Event.COMPLETE, loaderComplete);
function loaderComplete(e:Event):void
{
tt.text=loader.data;
}
但我的结果是:
1301,你好我的闪电
3001, ÓáÇã ÈÑ Êæ ÈÇÏ
问题在于数据已正确加载(假设您的 .txt 文件已正确编码为 unicode 格式。使用记事本 ++ 执行此操作)但您的 TextField 无法呈现特殊的 unicode 文本、波斯语、阿拉伯语或希伯来语。 不幸的是,唯一可用的解决方案是利用 "TLFTextField" 组件,该组件存在于 flash cs5 中,但由于实施笨拙而在以后的版本中被删除。无论如何,虽然有点晚了,但我 post 在这里使用 tlf 的解决方案因为使用 tlf 正确呈现文本可能真的很痛苦,给你:
- 下载 "textLayout.swc" 和 "tlfruntime.swc"
- 将这些 SWC 添加到项目库中。
- 嵌入你的字体,其中包含你的 unicode 语言的符号(在这种情况下你首选的波斯语字体)这非常重要,因为不是每个目标机器都有这种字体,这足以避免获得抗锯齿文本,即使显示文本。
- 确保您从字体属性的 ActionScript 选项卡中选择了 FTE(DF4)
- 您必须实例化您的嵌入字体。在下面的代码中,我们已经做到了这一点。假设 embeddedFont 是嵌入字体的 class 名称。
- 使用以下函数将文本渲染成tlf(注意这不是用flash timeline写的代码,它是用单独的编辑器写的,由flex sdk编译):
</p>
<pre><code>import fl.text.TLFTextField;
import flash.text.AntiAliasType;
import flash.text.engine.FontLookup;
import flash.text.Font;
import flash.text.TextFieldAutoSize;
import flash.utils.getDefinitionByName;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.formats.TextAlign;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.formats.VerticalAlign;
private var _font:Font= new embeddedFont() as Font;
/**
* Creates a center registered TLFTextField with the given text
* @param text targer text
* @param layoutFormat an object containing layoutFormat data. something like { textIndent: 8, color: 0xAAAAAA, fontFamily: "tahoma", fontSize: 28, autoSize: "center", antiAliasType: "advanced" }
* @param width width of the TLFTextField, auto set if 0
* @param height height of the TLFTextField, auto set if 0
* @return a center registered TLFTextField with the given text
*/
public function text(text:String, layoutFormat:Object = null, width:int = 0, height:int = 0):TLFTextField
{
var _txt:TLFTextField = new TLFTextField();
var _layoutFormat:TextLayoutFormat = new TextLayoutFormat();
if (layoutFormat == null) layoutFormat = new Object();
// creating the textfield
if (width != 0) _txt.width = width;
if (height != 0) _txt.height = height;
_txt.selectable = false;
_txt.embedFonts = true;
_txt.multiline = true;
//if either width or height are 0(not passed to function) and the wordWrap is true, autoSize wont work and width or height will be 0
if (width != 0 && height != 0) _txt.wordWrap = true;
if (layoutFormat.backgroud != undefined) _txt.background = layoutFormat.backgroud;
if (layoutFormat.backgroundColor != undefined) _txt.backgroundColor = layoutFormat.backgroundColor;
_txt.autoSize = (layoutFormat.autoSize != undefined)?(layoutFormat.autoSize) : (TextFieldAutoSize.CENTER);
_txt.verticalAlign=(layoutFormat.verticalAlign != undefined)?(layoutFormat.verticalAlign) : (VerticalAlign.MIDDLE)
_txt.antiAliasType = (layoutFormat.antiAliasType != undefined)?(layoutFormat.antiAliasType) : (AntiAliasType.ADVANCED);
// creating layout format
_layoutFormat.textAlign = (layoutFormat.textAlign != undefined)?(layoutFormat.textAlign):(TextAlign.CENTER);
_layoutFormat.textIndent = (layoutFormat.textIndent != undefined)?(layoutFormat.textIndent) : (8);
_layoutFormat.fontLookup = FontLookup.EMBEDDED_CFF;
_layoutFormat.color = (layoutFormat.color != undefined)?(layoutFormat.color) : (0xFFFFFF);
_layoutFormat.fontFamily = (layoutFormat.fontFamily != undefined)?(layoutFormat.fontFamily) : (_font.fontName);
_layoutFormat.fontSize = (layoutFormat.fontSize != undefined)?(layoutFormat.fontSize) : (42);
//setting text flow, text and attaching layout format
var _textFlow:TextFlow = _txt.textFlow;
_textFlow.hostFormat = _layoutFormat;
_textFlow.flowComposer.updateAllControllers();
_txt.text = text;
return _txt;
}
- 使用此代码获取 TLFTextField 并将其添加到显示:
</p>
<pre><code>private var _tlf:TLFTextField = text("سلام", { textIndent: 8, color: 0xAAAAAA, fontSize: 28, autoSize: "center", antiAliasType: "advanced" } );
stage.addChild(_tlf);
请注意,根据我的经验,使用 RTL 语言创建 tlf 文本时会有 100 毫秒的延迟。确保您在正确的时间创建所有文本(当没有动画、音频或视频打开时),否则您会出现轻微的停顿,足以破坏您的用户体验。