Android图片篇

图片大小:由分辨率、位深度、压缩程度

位深度:存储图片一个像素需要消耗多少个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基本就能满足需求。

Glide二次封装

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值