今天有点时间,就来聊一聊关键的技术点。
我以为主要的技术点,有两个:
一、如何按照用户的选择动态的描绘出头像。
大概很多人看到这个软件第一想法是:不就是几张图片层叠起来显示嘛。说实话我开始也是这么认为的,所以第一思路就是想方设法将图片层叠起来显示。但我几乎将android图片显示的各种方法都尝试了,依然不然层叠出像样的头像。
瞎搞了很多天,回过头研究了解压出来的代码残品,突然才醒悟,根本不是图片层叠嘛,这是画出来的。了解canvas的都知道,canvas支持按照指定的path描绘图形的操作。但问题是,如此复杂的图片,如何以path描述呢?有没有工具借助?这是我想到了以前接触的SVG。窃以为,SVG可以认为是标准化了的path。很多工具支持解析和生成SVG文件。于是问题豁然开朗。
那么SVG如何在android中解析呢?作为一个Java攻城狮的惯常思路是找开源。于是翻箱倒柜,终于找到一个非常轻量级的开源解析器,参考这个解析器,可以使用很少的代码解析大部分SVG格式文件。解析出SVG路径之后,就可以在canvas中描绘了。
二、如何快速低内存显示大量图片
这样一个apk,用到的图片之多,可能是大多数apk难以望其项背的,多达1000多张。而普通的Bitmap又非常耗费内存。如何尽量少占内存,快速显示是一个大问题。我上网找了很多乱七八糟的方法,实验证明,都没有效果。
经过实验,我总结了如下两个方面。首先要使用BitmapFactory.decodeStream解析图片文件,BitmapFactory.decodeStream直接使用本地方法解析图片文件,无疑会快很多。其次,对于一个120*120的1K文件来说,使用通常的方法解析,一个点要占8个字节,也就是120*120*8=115200,这无疑太大了。因此可以设置BitmapFactory.decodeStream的Options,将options.inPreferredConfig 设置为 Bitmap.Config.ALPHA_8,这样解析时一个字节只需要占用1个字节,这无疑大大减少了内存占用。
但对于1000多张这样大量的图片来说,还是占用内存不少。这就需要使用到LruCache啦。使用LruCache需要指定一个缓存阈值,LruCache会按照最近最少使用原则,在占用内存超过阀值后自动将最近最少使用的对象移除,从而减少内存占用。
先写这些,有时间再聊。
附上源码:http://download.csdn.net/detail/zhufengweihai/7929481
仅供参考复制借鉴剽窃,哈哈