本文共 7613 字,大约阅读时间需要 25 分钟。
本文的所有内容几乎全部来自郭神的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进行其他处理,可以如下处理:
SimpleTargetsimpleTarget = 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)
FutureTargettarget = 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 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 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中配置:
该部分在郭神的系列博客当中说明地很详细,就不再说明了。
转载地址:http://dorki.baihongyu.com/