本文的所有内容几乎全部来自郭神的Glide解析系列博客,郭神的水平是我非常敬佩的,在浏览完该系列博客之后,有了想把Glide用法汇总起来方便查阅的想法。原系列博客包括很多源码解析,篇幅比较长,我这里只总结使用方法,想深入了解原理的请阅读郭神的博客。郭神的解析是针对Glide3.7的版本,该版本已经非常成熟和稳定,可以作为长期使用的版本,所以以下所有的使用说明都是针对该版本的。
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}
String url = "http://img6.3lian.com/c23/desk4/07/01/d/09.jpg";
Glide.with(this).load(url).into(imageView);
Glide最基本的使用方式,其实就是关键的三步走:先with(),再load(),最后into()。
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.into(imageView);
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)//设置不做任何缓存
.into(imageView);
Glide.with(this)
.load(url)
.asBitmap()//指定只显示静态图片
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)//.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)原始大小
.into(imageView);
Glide.with(this)
.load(url)
.skipMemoryCache(true)
.into(imageView);
token作为一个验证身份的参数并不是一成不变的,很有可能时时刻刻都在变化。而如果token变了,那么图片的url也就跟着变了,图片url变了,缓存Key也就跟着变了。结果就造成了,明明是同一张图片,就因为token不断在改变,导致Glide的缓存功能完全失效了
public class MyGlideUrl extends GlideUrl {
private String mUrl;
public MyGlideUrl(String url) {
super(url);
mUrl = url;
}
@Override
public String getCacheKey() {
return mUrl.replace(findTokenParam(), "");
}
private String findTokenParam() {
String tokenParam = "";
int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
if (tokenKeyIndex != -1) {
int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
if (nextAndIndex != -1) {
tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
} else {
tokenParam = mUrl.substring(tokenKeyIndex);
}
}
return tokenParam;
}
}
使用:
Glide.with(this)
.load(new MyGlideUrl(url))
.into(imageView);
如果into()里面的参数不是ImageView类型,那就不能直接传入,如大图缩放框架的控件LargeImageView,或者还想对获取到的drawable进行其他处理,可以如下处理:
SimpleTarget simpleTarget = new SimpleTarget() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
imageView.setImageDrawable(resource);
}
};
Glide.with(this)
.load(url)
.into(simpleTarget);
先加载不显示,要显示的时候再显示,注意缓存策略必须设置为DiskCacheStrategy.SOURCE
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
a、子线程执行downloadOnly(int width, int height)
FutureTarget target = Glide.with(context).load(url).downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
final File imageFile = target.get();//此处会等待下载,线程阻塞
显示时调用:
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
需要注意的是,这里必须将硬盘缓存策略指定成DiskCacheStrategy.SOURCE或者DiskCacheStrategy.ALL,否则Glide将无法使用我们刚才下载好的图片缓存文件。
b、主线程执行downloadOnly(Y target)
其实downloadOnly(int width, int height)方法必须使用在子线程当中,最主要还是因为它在内部帮我们自动创建了一个RequestFutureTarget,是这个RequestFutureTarget要求必须在子线程当中执行。而downloadOnly(Y target)方法则要求我们传入一个自己创建的Target,因此就不受RequestFutureTarget的限制了。
public class DownloadImageTarget implements Target {
private static final String TAG = "DownloadImageTarget";
@Override
public void onStart() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
}
@Override
public void onLoadStarted(Drawable placeholder) {
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
}
@Override
public void onResourceReady(File resource, GlideAnimation super File> glideAnimation) {
Log.d(TAG, resource.getPath());
}
@Override
public void onLoadCleared(Drawable placeholder) {
}
@Override
public void getSize(SizeReadyCallback cb) {
cb.onSizeReady(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
}
@Override
public void setRequest(Request request) {
}
@Override
public Request getRequest() {
return null;
}
}
使用时:
Glide.with(this)
.load(url)
.downloadOnly(new DownloadImageTarget());
a、listener方式
Glide.with(this)
.load(url)
.listener(new RequestListener() {
@Override
public boolean onException(Exception e, String model, Target target,
boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.into(imageView);
b、GlideDrawableImageViewTarget方式
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(new GlideDrawableImageViewTarget(image) {
@Override
public void onLoadStarted(Drawable placeholder) {
super.onLoadStarted(placeholder);
}
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation super GlideDrawable> animation) {
super.onResourceReady(resource, animation);
}
});
a、不进行图片变换
Glide.with(this)
.load(url)
.dontTransform()
.into(imageView);
b、指定图片变换
Glide.with(this)
.load(url)
.centerCrop()
.into(imageView);
Glide.with(this)
.load(url)
.fitCenter()
.into(imageView);
c、自定义图片变换
需继承BitmapTransformation类重写transform方法
使用时:
Glide.with(this)
.load(url)
.transform(new CircleCrop(this))//CircleCrop继承了BitmapTransformation类,此处省略实现过程
.into(imageView);
d、推荐图片变换框架
裁剪变换、颜色变换、模糊变换等等 https://github.com/wasabeef/glide-transformations
compile 'jp.wasabeef:glide-transformations:2.0.2'//用该版本即可,更高版本对应Glide4.0以上,有冲突
public class MyGlideModule implements GlideModule {
public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));
//修改图片加载格式
//builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//注意!如果设置成ARGB_8888格式,上面第13点提到的图片变换框架glide-transformations将失去变换效果
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
ExternalCacheDiskCacheFactory的默认缓存路径是在sdcard/Android/包名/cache/image_manager_disk_cache目录当中;Glide加载图片的默认格式是RGB_565,而Picasso加载图片的默认格式是ARGB_8888。ARGB_8888格式的图片效果会更加细腻,但是内存开销会比较大。而RGB_565格式的图片则更加节省内存,但是图片效果上会差一些。
AndroidManifest.xml中配置:
该部分在郭神的系列博客Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能当中说明地很详细,就不再说明了。