学医的假小子 发表于 2024-3-2 23:01:36

脱离TextField的点阵文本渲染引擎TextBox(可应对安卓字体错乱)

应 @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的方法使用标记把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)

学医的假小子 发表于 2024-3-2 23:03:17

链接被吞了QAQ
/s/104McOMujFX52swcGP31W9w?pwd=2003

学医的假小子 发表于 2024-3-2 23:14:38

摘要:
BitFont.loadBitFont() 加载字体
BitFont.getBitFont() 获取字体
TextBox 实现了TextField中的最主要的几个常用功能,例如:
text
htmlText
textColor
appendText()
width/height
textWidth/textHeight
border/borderColor
background/backgroundColor
multiline/wordWrap/rowSpacing
leftMargin/rightMargin/topMargin/bottomMargin
scrollV/scrollH/maxScrollV/maxScrollH
除此之外
还有scrollBarV/scrollBarH(滚动条开关)
useIbeamCursor(使用工字型鼠标)
注释不多QAQ不是我不喜欢注释 而是我觉得字面已经写的很明白了 能看懂的人不需要注释也能看懂
至于风格QAQ我就是喜欢紧凑型风格
页: [1]
查看完整版本: 脱离TextField的点阵文本渲染引擎TextBox(可应对安卓字体错乱)

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)