【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
应 @Liushui 之邀,利用寒假尝试了下 (宋体12-17字号不会失真,其它字体容易失真)
宋体
(示例)
楷体
(示例)
黑体
绪论:
在AIR for Android中,旧版的airsdk在某些型号的手机中出现字体错乱,据说是由于字体映射表错误造成的。除了更新airsdk和嵌入字体外,笔者想出了另一种解决方案。
把ttf的每个字都渲染出一个点阵字体,用as3读取点阵字体文件,然后再用bitmap显示点阵。当然点阵字体只能用固定的字号,缩放会导致失真。笔者先测试了一下16*16*65536生成了一个大小为32*64KB=2MB的文件(当时扩展名叫afb, Acid Font Binary),可以做到,只是存在两个问题:①ttf渲染点阵需要时间 ②有些字体,系统自动进行的消除锯齿会使某些像素既不是黑色也不是白色,而是不同程度的灰色,如何处理这些灰色都会使结果字体失真。
笔者先寻找点阵字体的通用格式fon,寻找其文档。接下来发现,这种格式并不统一。找到的文档中所介绍的fon为易于读取的一种,但系统字体中的fon却是MZ格式的,而另一款游戏中自带的fon又是它的另一种格式。综合情况,为了易于读取,笔者只得自定义格式cfb,具体细节见txt介绍。您可以使用“字体生成器”生成cfb文件。
引擎非常简洁,主要只有两个类:TextBox.as和BitFont.as。其中BitFont对应字体文件,而TextBox则是用来代替TextField的(因为TextInput和TextArea都被用了,只得借用C#中的词)。另外,OurPatch.as可以帮助您把某项目中的全部TextField批量替换成TextBox。
大致关系如下:您需先使用BitFont读取cfb文件,此处有两种方式,一是使用URLRequest外部加载,二是借助Flex的方法使用[embed]标记把cfb文件以ByteArrayAsset的二进制形式嵌入swf中,然后再用BitFont加载。注意:第一种方法是异步操作,在从您开始加载到加载成功或失败的结果中有一段等待期,在这段时间内,您可以设置TextBox的text等大多数属性,TextBox会自动等待字体加载成功后即显示文本。但是,在等待期内,您获取如maxScroll等属性时将不会得到正确的数值。因此,您应加载事件侦听器,等待TextBox的complete事件后再开始您的执行。第二种方法是同步操作,只有在ByteArray加载并解析完成后,代码才会继续执行,因此您无需考虑等待期的问题。显然更加推荐第二种方法。
此版本的TextBox只有显示功能,不能选中也不能编辑。如果在电脑端,选中和编辑功能很容易实现,可以用一个闪动的矩形反色像素区域代表光标;支持caretIndex和selection等属性;在TextBox获取焦点时,把焦点转移给一个看不见的TextField然后侦听其输入与按键,决定TextBox的输入与退格;使用ContextMenu和Clipboard控制剪贴板。但是因为主要问题是出现在AIR手机端,电脑端一般不需要这样的引擎,因此未予支持。TextBox支持滚动条滚动但未支持鼠标滚轮滚动也是相同原因。而手机端的选择是由长按控制的,概念较为模糊,如有需要,您可自行尝试处理。对于手机端的编辑而言,建议寻找一种方法,生成类似于js中prompt()的输入对话框,输入框中的默认文本为文本框中的现有文本,让用户编辑后确定,获取到编辑后的文本。 (更多介绍请看文件) (对不起呜呜呜QAQ等级低,这里只能上传1MB的文件>_<原谅我) 百度网盘下载(15.9MB)
|