在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫Glide的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app,以及Yelp app;
英文原文Introduction to Glide, Image Loader Library for Android, recommended by Google
github地址https://github.com/bumptech/glide
该库用法上和 Picasso 有很多相似的地方,目前能下载的版本是3.6.1,下面是这几天的学习,已经在公司的项目上替换,简单介绍下:
添加依赖:
dependencies {
compile'com.github.bumptech.glide:glide:3.6.1'
compile'com.android.support:support-v4:22.0.0'
}
Eclipse 开发的话可以直接下载Jar包
基本用法:
Glide.with(context).load(imageUrl).into(imageView);
非常简单的流式代码,还有很多方法, 像
crossFade()默认动画,fitCenter(),placeholder()占位图,error()错误图,空图等可以自己试试;
这里的Glide.with() 不仅可以传 Context ,还可以传Activity 和 Fragment,因为图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载。
Glide 默认的图片格式是RGB_565,显示方面要差点,看的并不明显,当然可以自己修改为ARGB_8888,方法:
public class OkHttpGlideModule implements GlideModule {
public OkHttpGlideModule() {
}
public void applyOptions(Context context,GlideBuilder builder) {
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
public void registerComponents(Context context,Glide glide) {
glide.register(GlideUrl.class,InputStream.class, newFactory());
}
}
同时在AndroidManifest.xml中将GlideModule定义为meta-data
android:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"
android:value="GlideModule"/>
如果想用Okhttp做协议栈可以直接添加 glide-okhttp-integration-1.3.1.jar ,并且在Application 或Activity 的onCreate 方法注册就可以使用okhttp做为协议栈,Volley也是同理;
Glide.get(this).register(GlideUrl.class,InputStream.class,newOkHttpUrlLoader.Factory(newOkHttpClient()));
所以,要想使用ARGB_8888模式,又想Okhttp做协议栈,就不能用glide-okhttp-integration-1.3.1.jar,直接抽取里面的OkHttpGlideModule类然后,添加builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
用起来很简单,说下注意点吧:
1.placeholder() 占位图或者失败图都可以直接使用R.color.white 颜色来做;
2.如果加载不出来图片的话可以试试设置下图片的宽高;
3.图片的加载并不是全缓存,而是使用的imageview的大小来的,如果想要全缓存的就可以这样:
.diskCacheStrategy(DiskCacheStrategy.ALL)
4.图片加载背景会变成绿色,加载jpg图片会出现的BUG,github上给出解决方案
Glide.with(this).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView); 或者
Glide.with(this).fromResource().asBitmap().encoder(newBitmapEncoder(Bitmap.CompressFormat.PNG,100)).load(R.drawable.testimg).into(imageView);
5.圆形图片我用的是V4包自带的处理方式:
Glide.with(context).load(imageUrl).asBitmap().fitCenter().diskCacheStrategy(DiskCacheStrategy.SOURCE)
.placeholder(R.drawable.shape_glide_round_place).error(R.drawable.no_face_circle)
.into(newBitmapImageViewTarget(imageView) {
@Override
protected voidsetResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(),resource);
circularBitmapDrawable.setCircular(true);
imageView.setImageDrawable(circularBitmapDrawable);
}
});
6.本地图的加载可以
Glide.with(context).load(newFile(filePath)) 也可以直接load("/mnt/本地图片");
7.默认的动画可以取消掉,加上dontAnimate()
8.清除缓存:
Glide.get(this).clearMemory();
Glide.get(this).clearDiskCache(); 需要在子线程执行
9.加载暂时不支持显示进度,可以用占位图来显示,把占位图替换成帧动画, 如果一定要显示数字进度,可以配合Okhttp协议栈来处理,
参考该例子:https://github.com/futurobot/Glide-Download-Progress-Interceptor
最后放张效果图,该图片转自www.open-open.com/lib/view/open1438154211785.html
```里面介绍几个方法可以使图片加载更快,包括预加载方式,ListPreloader类的使用;```
网友评论