前言
图片的加载一直是安卓开发中的一个重要环节,因为相较于文字,图片的数据量非常大。处理不好图片,也就无法提供给用户一个良好的使用体验。而Glide就是为了加载图片而生的一个开源库。
1. 为何使用Glide?
在我最开始接触安卓的时候,是没有用任何图片加载库的,直接从网络获取数据流,转成Bitmap,然后手动装到ImageView里。后来发现有Picasso这个库,只要有url就能自动帮助加载,不要太方便。此后的一段时间就一直用Picasso。
但随着时间的推移,我发现Picasso这个库的缓存支持很奇怪。网上有的说要和Okhttp一起使用才有缓存,还有的说就没有硬盘缓存功能。总之我查了半天也没有头绪。因此我决定换一个支持本地缓存的图片库。
刚开始是用Fresco的。这个库,不能说不好,但是有着一些不方便的地方。第一个是体积太大,一个库直接把安装包增加了1M;第二个是它需要控件支持,把原来的ImageView改成这个库的自定义控件,这样的话和很多其他的控件库就不兼容。最典型的是Photo View这个库,也是要改控件的。因此,当要求放大图片,而且支持手势缩放的时候,Fresco这个库自带的功能无法满足,而且也限制了不能用其他的库,于是最终没有选择这个库。
之后,我选择了Glide。从我的使用经历,其优点如下:
- 强大的缓存支持
- 支持GIF
- 灵活便捷的使用方式
- 支持和常见网络处理库的耦合
- 不需要修改控件
缺点几乎没有,硬要说有的话就是设置不当会加载很慢,还有少数情况下我自定义的rounded image view变成了方的。
2. 把Glide加入项目
Glide的整合非常方便,把下面的代码整合到gradle文件即可:
repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}
此外,Glide还支持和Okhttp3,Volley等常见网络处理库的耦合,也需要进行一些设置。比如想要和Okhttp3进行耦合,在dependencies里面就需要加入compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'。
3. Glide基础使用
Glide的使用和Picasso非常类似。
Glide.with(mContext).load(url).into(ImageView); // 基础版
Glide.with(mContext).load(url).override(width,height).error(R.drawable.ic_img_err).placeholder(R.drawable.ic_img_placeholder).diskCacheStrategy(DiskCacheStrategy.SOURCE).dontAnimate().centerCrop().into(ImageView); // 正常版
Glide的基础使用至少需要三个参数,第一个是context参数,第二个是图片源参数,可以是url也可以是drawable的source id,第三个则是加载的目标控件。
可以选择的参数就比较多了。override可以指定宽度和高度,error指定失败时显示的图片,placeholder指定加载时使用的图片,diskCacheStrategy指定缓存策略,之后会提到,dontAnimate隐藏过渡动画,centerCrop裁剪图片适应控件比例。此外,还有asBitmap(), asGif(), thumbnail()等等方法,总之功能比较全面。
4. Glide全局设置
Glide还支持全局设置,可以规定缓存空间的大小,解码格式,还有一些进阶的设置。详细信息请参考官方说明。
一份比较简单的设置文件如下:
public class MyGlideModule implements GlideModule {
@Override public void applyOptions(Context context, GlideBuilder builder) {
// Apply options to the builder here.
int cacheSize100MegaBytes = 104857600*2; //200MB
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)
.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheSize100MegaBytes))
.setMemoryCache( new LruResourceCache( customMemoryCacheSize ))
.setBitmapPool( new LruBitmapPool( customBitmapPoolSize ));
}
@Override public void registerComponents(Context context, Glide glide) {
// register ModelLoaders here.
}
}
5. Glide缓存使用
Glide默认是使用memory cache和disk cache的result模式的。
memory cache可以用skipMemoryCache(true) 来取消。
diskCacheStrategy有4种选择:None, All, Source, Result。None就是取消,Source是只缓存源文件,Result是缓存处理过的文件,All是把Source和Result都缓存。
很明显,要缓存的越多,第一次加载也就越慢。对于经常改变的图片,None是不错的选择;对于周期性的图片,可以用Source;对于不怎么改变的图片,可以考虑All或者Result。
此外,对于Gif来说,官方的建议是只使用Source模式。
6. Glide和Gif
虽然Glide有asGif()方法,但根据我的实验,就算不用,还是可以直接加载Gif。当然我指的是目标内容,假如想把Gif作为加载动画,用两个Image View可能比placeholder要靠谱一些,或者尝试一些其他的加载动画的库比如AVLoadingIndicator等等。
此外,由于Glide对控件没有要求,可以考虑和Gif Drawable库一起使用来获得更好的效果。
7. 总结
Glide是相当方便好用易上手的库。