如何正确放置我们的图片资源

一.背景

为了减少app的体积,有时候我们会选择将icon和背景图只放置在drawable-xhdpi目录下面。其目的就是使用一张图也能在不同屏幕密度的设备上适配,使那些设置wrap_content的图片在不同屏幕密度的设备上保持相同的比例。(当前这些图片会根据不同屏幕密度而进行缩放)。


 二.存在问题

事实上,当前很多android设备厂商将1080p(440-480dpi,对应xxhdpi)屏幕作为旗舰屏幕。若我们将图片在放置在drawable-xhdpi目录下面,1080p屏幕上相同的Bitmap大小会变为以前的1.5倍。若我们把相同的图片放置在drawable-xxhdpi下面,图片显示一样清晰,但Bitmap大小不会扩大。

 

我们首先介绍一下一张bitmap位图在内存中的大小的计算公式:

 

bitmap占内存大小 = 图长 * 图宽  *  每个像素占用的字节数

 

其中每个像素占用的字节数与Bitmap.Config的配置有关,默认的配置为ARGB_8888

  • Bitmap.Config.ALPHA_8 此时图片只有alpha值,没有RGB值, 一1个像素占用一个字节
  • Bitmap.Config.ARGB_4444 一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites共16bites,即2个字节
  • Bitmap.Config.ARGB_8888 一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites,共32bites,即4个字节。这是一种高质量的图片格式,在电脑上普通采用。它也是Android手机上一个Bitmap的默认格式。
  • Bitmap.Config.RGB_565 一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明,Red(R)值占5个bites ,Green(G)值占6个bites ,Blue(B)值占5个bites,共16bites,即2个字节。对于没有透明和半透明颜色的图片来说,该格式的图片能够达到比较的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销。


所以假设10张600*600的图片加载到内存中。

1.  若系统未进行缩放占用的内存为600*600*4*10大约14兆内存。

2.  若我们将图片放置在xhdpi下,并在1080p手机上使用,则会占用14*1.5的内存。2k屏的手机14*2的内存占用。


三.实际测试

我们使用sony z3 compact测试,将引导图中的wrap_content改为dp值,并将引导图从drawable-xhdpi移动到drawable-nodpi中,我们切换到引导图页面,比较前后堆空间大小。

 

 

 

 

图片放置drawable-xhdpi下的结果如下图:41.03MB


 

图片放置drawable-nodpi下的结果如下图:31.56MB

 


四.结论

从图中可以看出,堆空间的大小节省了快10兆,而且图片的显示质量是一样的。事实上与其让系统帮我们把bitmap放大,还不如我们自己手动将图片宽高设置成dp,并将图片资源放置在drawable-nodpi中。


五.UI切图使用方式

下面部分是我的一些看法,大家若有疑问可以一起讨论下,再确定最终执行方案。

1. 以后我们一些小icon,如返回图标,分享,点赞,等类似的小图片,尽量使用3x的图,并放置在drawable-xxhdpi。因为主流的手机已经是1080p的了,而非之前的720p。这样可以保证旗舰的机型显示不至于失真,这些小icon的宽和高可以设置成wrap_content,当然,我觉得设置成dx值也是可以的。

2.大家也看到一个现象,我们app大的资源背景图比较多,这一块我们可以从减少app包大小的角度出发,使用2x的图,并放置在drawable-nodpi目录下,并且宽高一定不要设置成wrap_content,尽量用dp或者match_parent代替。


六.参考资料

http://blog.csdn.net/wrg_20100512/article/details/51295317

 


更多相关文章

  1. Drawable的Tint变色(让Android也能有iOS那么方便的图片色调转换)
  2. Android中利用“反射”动态加载R文件中的资源
  3. [置顶] android中图片的三级cache策略(内存、文件、网络)之二:内存
  4. android App自适应draw9patch不失真背景(转)
  5. AndroidStudio mipmap图片大小
  6. android 一张图片实现 ImageView 实现 点击效果 图片明度变化
  7. 浅谈Android中的基础动画(图文详解)
  8. ReactNative之Image在Android设置圆角图片变形问题
  9. Android(安卓)OpenGLES2.0(八)——纹理贴图之显示图片

随机推荐

  1. 移动应用测试框架—Calabash Android(安
  2. 点击事件必须点两次才能生效的原因
  3. android 识别图片上的二维码
  4. SD卡读写文件 代码学习
  5. Android实现自动点击 - 无障碍服务
  6. android源代码下载——android环境配置
  7. 【Android】_SmsReceicer_短信监听
  8. 渐变色与圆角显示(填充,描边)
  9. Android入门之SeekBar
  10. Android(安卓)——Window类