图片大小:由分辨率、位深度、压缩程度
位深度:存储图片一个像素需要消耗多少个bit位。通常图片位深度是32,alpha以及rgb各八位。
图片是如何加载的
有多种形式可以作为图,例如png图片、shape.xml、点9图片、gif动图、颜色、bitmap等。
View在加载图片的时候,不论图片资源是各种id还是bitmap等,都会先转换成对应的Drawable,然后在drawBackground、onDraw、onDrawForeground方法里,调用对应Drawable.draw(Canvas canvas)
抽象类Drawable,子类会实现draw(Canvas canvas)方法,方法里会定如何在画板上绘制图片。有多种Drawable,如ColorDrawable、BitmapDrawable、NinePatchDrawable、GifDrawable、ShapeDrawable等
Android图片加载优化
为什么需要优化
因为现在图片的分辨率的一般都很大,而实际不需要这么大的图片。
如何优化
图片压缩:根据图片的大小以及控件大小,计算出图片的采样率
质量压缩:常见的图片格式在设置在UI上之前需要经过解码过程,使用RGB-565代替ARGB-8888可以降低图片占用内存。options.inPreferredConfig = Bitmap.Config.RGB_565;
内存重用:后面的图需<=第一张图的大小,下图为第二张图片重用第一张图
优化原理
mipmap、drawable
mipmap 放桌面 icon,drawable 放其它。
对于非谷歌手机,两个没有任何区别。对于谷歌手机,mipmap有点区别。 mipmap的区别原因主要是按照.aab包影响的。aab包放mipmap图片显示会好点。
如何让Android图片资源适配各种分辨率的手机
先了解分辨率和DPI ,分辨率单位为px
240-320 xhdpi
320-480 xxhdpi !!!主流
480-640 xxxhdpi下面提供两种方案
方案一:为每种dpi都出一套图片资源 (为设计师增加了工作量,且增大了APK大小)
方案二:提供一套需要支持的最大dpi的图片,(自动渲染的概念);
同名图片放在不同密度的文件夹下,系统选择图片规律
android终端会根据自己的dpi值,会匹配与之最相近密度的资源目录,如果没有找到,则会向更高资源目录寻找,再向无关屏屏幕密度的文件夹nodpi寻找, 找不到再向低一级的屏幕密度的目录下寻找,如果还是找不到就要匹配drawable目录下了
裁剪图片
裁剪图片方式有多种,如自定义控件、自定义Drawable实现onDraw接口,或者使用第三方控件Glide、Picasso自定义Transformation。其实原理都类似。
首先要缩放图片:通过图片获取到原始Bitmap、然后通过原始bitmap,根据Matrix矩阵缩放,创建新的Bitmap
然后绘制到canvas上:利用canvas、paint接口绘制各种图形。
三方框架对比
Universal Image Loader是早期比较有代表性的图片加载库,虽然目前已经停止维护,不再推荐使用,但是其架构设计和实现依然值得借鉴。
Picasso的设计充分体现了Square公司在架构设计上一贯的简洁易用风格(链式调用)。
Glide充分吸收了Picasso的优点,并在此基础上做了大量的优化和改进。
Fresco 可以说是综合了之前图片加载库的优点并将性能优化到极致,但它的包很大,用法比较复杂,API不够简洁,所以, Fresco 在图片较多的应用中更能凸显其价值,如果应用没有太多图片需求,还是不推荐使用 Fresco,Glide基本就能满足需求。