Glide加载图片缩放模式
前不久做一个水平图片滑动列表选择,效果类似于QQ发送图片。因为图片的长宽比不一致,而高度是固定的,所以就要对图片进行特殊拉伸。所以就看了下Glide拉伸这一块的源码。废话不多说了,下面开始总结。
平时我们用BitmapFactory进行加载较大图片时候,往往先通过inJustDecodeBounds方式解析出图片宽高,再结合ImageView宽高计算inSampleSize(即缩放比例),然后再“按需”加载bitmap,并显示出来。
那在Glide中是如何实现拉伸的呢?
其实Glide中实现也是上述思路,只是封装起来了。Glide负责计算缩放比例并decode的类是Downsampler,其中的getRoundedSampleSize 就负责计算缩放比例的。
public abstract class Downsampler implements BitmapDecoder<InputStream>{
//这个方法decode图片得到bitmap,其实最终也会调用BitmapFactory.decode()方法
@Override
public Bitmap decode(InputStream is, BitmapPool pool, int outWidth, int outHeight, DecodeFormat decodeFormat) {
...省略...
//这里计算缩放比例
final int sampleSize = getRoundedSampleSize(degreesToRotate, inWidth, inHeight, outWidth, outHeight);
//正式解析
final Bitmap downsampled = downsampleWithSize(invalidatingStream, bufferedStream, options, pool, inWidth, inHeight, sampleSize,decodeFormat);
...省略...
}
...
//计算缩放比例
private int getRoundedSampleSize(