前两天一个网友请我帮忙用as3实现图文混排的组件,要求支持复制粘贴和剪切功能,还好这段时间不忙,便答应了尝试一下。刚着手的时候考虑使用占位字符,类似[smile]表示笑的表情,不过都还没开始敲代码就发现这样不行,文本框里会显示[smile]的文本,必须要用空白字符才行。那就计算图片的宽度以及空格的宽度,用多个空格来占位吧。那高度呢?用回车?如果一行中有多个不一样大小的图片那不是还要计算最大高度?还有复制粘贴的时候怎么知道复制了哪个?天啊,原来图文混排还要考虑这么多东西的。最怕遇到这些想不通的问题,晚上又要失眠了。
第二天早上就不再自己想了,还是先研究下别人是怎么做的,于是重点学习那个朋友发给我参考的一些demo,有用Bitmap自己重新draw的,这个要计算很多东西,直接pass。发现另一个的作法是用中文空格字符(UniCode码12288)作为占位符,然后设置这个字符的size为图片高度,再通过图片宽度计算letterSpace,这样只需要在字符对应的位置上面放一张图片即可。天才啊,我想再也没有比这更简单的作法了吧。那么问题来了,我修改文本的时候怎么知道这个字符跑到哪去了呢?他的作法是每张图片都有一个index属性,对应字符在文本中的位置,每次修改文本的时候都判断在哪个位置增加了多少字符,删除了多少字符,再更新图片的序号。但这样还是要做很多复杂计算。而且最重要的一个问题是他没有实现粘贴图片的功能,如果自己实现个粘贴板又要一大堆复杂的计算。天啊,实现了这个功能后我是不是就可以写操作系统了?
应该会有更简单的办法的,为什么不想想UniCode里还有没有其他不显示出来的空白字符呢?这样一个字符对应一个图片什么问题都解决了。于是我就随机测试了几组编码范围,发现62000到63000这一段的编码会显示空白。哈哈,原来真的有这样的字符,感动得泪流满面啊!后面专门搜了一下有关UniCode的文章,有兴趣的同学可以看这里,还有一张震撼的鸟瞰图!原来57344到63743这段范围的字符都是看不到的,我刚好测试出来的是他的子集。
本来以为这样就完事,但事情总不会像你想象的那么简单,在chrome中居然把这个看不到的字符显示出来了,而且字符间距和我调试的不一样,想不到flash也有兼容性问题啊。这怎么办呢?难道限制不能插入半透明的图片么?那间距怎么处理?wait,这会不会是字体的问题?以前遇到过微软雅黑在chrome中显示不出来的问题,那我把这个字符的字体设置为宋体(simsun)吧,果然,这次真的没问题了,是真的!!!我没骗人。其实还会有点小问题的,类似要用flashplayer11及以上版本发布之类,不过这些都是小儿科了。真想不到核心代码就那么几十行的东西能折腾出这么多问题来。
我是不是不久没说话了,一说就那么大堆废话,那废话就不多说了,demo走起:
源码托管地址:https://git.oschina.net/wl/RichTextField