自定义中文字体解决方案

来源:互联网 发布:淘宝裤子好评语100字 编辑:程序博客网 时间:2024/06/06 00:00

一个应用调用自定义字体,在部分机器上无法正确使用自定义的字体。有些甚至是同一款机器,所以分辨率之类的因素可以排除。最后发现是版本原因,系统版本低于Android 2.3的机器上通通出问题,2.3以上的正常。但代码都是针对Android 1.6的API的啊,别说2.3,连2.0的API都没用到。查询Android 2.3的highlights,看到下面这句话:

There is no longer a limit on the size of compressed .apk assets that can be read.

从2.3开始,对可读取的压缩后的.apk中的资源的大小不再有限制。这意味着在2.3之前都是有限制的。翻看LogCat中的记录,会有如下的信息:

Data exceeds UNCOMPRESSE_DATA_MAX ( XXXXXXXXXX vs 1048576)

其中XXXXXXX是一个大于1048576的值。也就是说,在压缩打包到APK文件中的资源文件,在解压后的大小不能超过1MB。否则在Android 2.3之前的系统中就无法正确读取该资源文件。而我们用的中文字体文件的大小显然超过了1MB,失败的原因就在这里。怎么办?

中文社区中对此有这样的一篇广为转载的文章,《Asset限制文件大小UNCOMPRESS_DATA_MAX为1MB》,其中的结论是:

目前解决的方法只有将文件放入到sdcard,但这样除了microsd的读取IO效率和耗电量解决不是很好,同时sd卡移除时可能存在问题,解决的方法如果数据量大的化通过sqlite是一种解决方法,同时openFileOutput方式读取也是不错的选择,看来android操作系统中最安全控制的严格,但犯了一个不小的错误。

字体文件显然没办法塞到sqlite里面,要求所有的用户都有SD卡也不太友好。又翻到一篇相关的英文文章,Dealing with Asset Compression in Android Apps。从中可以看出,Android 2.3之前的版本只对压缩过的资源文件的原始大小做了限制,这种限制可能是出于计算性能的考虑。对于没有压缩的文件,是没有大小限制的。哪些文件不会压缩?图片、音频、视频,包括这些后缀:

“.jpg”, “.jpeg”, “.png”, “.gif”, “.wav”, “.mp2″, “.mp3″, “.ogg”, “.aac”, “.mpg”, “.mpeg”, “.mid”, “.midi”, “.smf”, “.jet”, “.rtttl”, “.imy”, “.xmf”, “.mp4″, “.m4a”, “.m4v”, “.3gp”, “.3gpp”, “.3g2″, “.3gpp2″, “.amr”, “.awb”, “.wma”, “.wmv”

从Android的源代码中可以知道,Android的打包工具是通过文件的后缀名来判断文件是否需要压缩的。如果文件的后缀名是上面这些后缀,文件就不会被压缩,大小也就没有限制;如果文件的后缀不是上面这些,就对其进行压缩,并且在Android 2.2上有1MB的大小限制。字体文件后缀通常是.ttf,属于要被压缩的,在Android 2.2之前的版本中就有了体积限制。不过,看到这里,解决方案也出来了,把字体文件的.ttf后缀改成上述任意一个后缀,然后修改相应的代码就可以。好猥琐的解决方案啊~~

结论:中文社区的水平似乎还是跟老外有点差距,或者是高手的分享意愿不强烈;Android本身及其相关的开发工具的源代码是值得去读读的;Android里面有一些看似奇怪的条条框框,这种非API的版本变化,如果不在2.3以下的机器上测试是根本发现不了的。


-------------------------------------------------------

我做的实现:

         Typeface face=Typeface.createFromAsset(getAssets(),"fonts/STXINGKA.jpg");         tv.setTypeface(face);


这里使用的是华文行楷,文件大小为:3.83MB


实现效果:







原创粉丝点击