对于每个安卓程序猿来说,图片的加载是最常见问题,不管是简单的单一图片还是炫酷的gif图片,大家都应注意的问题OOM,当然对于有点经验的人来说,在开发阶段就会注意这个问题了,解决措施也很简单,利用缓存策略LruCache和DisLruCash,在内存不足时清除缓存,当然这个方法需要自己去写一些ImageLoader,现在没人回自己去写这个了,因为有大神的杰作,就是本文的主人公Glide;
这里的导入只针对AS的使用,一些还抱着Eclipse的同学,慢慢改变使用AS吧,你会发现真的很方便也很智能:
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}
Glide的使用也很简单,一句话搞定,当你第一次使用的时候,肯定对大神万分膜拜啊:
Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").into(imageView);
先看一下Glide.With(),这里传入一个上下文对象,有没有想过为什么要传入呢?了解过源码的同学可能知道这里可以穿入三种对象,根据传入对象的生命周期,会去在合适的时机加载或销毁图片:
RequestManager with(Context context)
RequestManager with(Activity activity)
RequestManager with(FragmentActivity activity)
看一下load()的方法,可以传入不同的参数类型:
DrawableTypeRequest<String> load(String string)
DrawableTypeRequest<Uri> load(Uri uri)
DrawableTypeRequest<File> load(File file)
DrawableTypeRequest<Integer> load(Integer resourceId)
DrawableTypeRequest<URL> load(URL url)
简单实用一下,具体读者自家尝试:
int resourceId=R.mipmap.image;
Glide.with(context).load(resourceId).into(imageView);
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "image", "image.jpg");
Glide.with(this).load(file).into(imageView);
大家都知道在加载图片的时候会出现各种问题,这也导致了图片加载会不会成功,那么当图片不成功时,Glide提供两种方法,其一就是占位placeholder:
Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").placeholder(R.mipmap.place).into(imageView);
另一个就是 error
Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").error(R.mipmap.error).into(imageView);
这两个方法都是见闻知意不做解释,那么这两个方法在什么地方调用?又如何调用呢?我们知道这种掉用方式肯定是有监听器,监听执行的,Glide提供了listener的接受对象RequestListener:
//设置错误监听
RequestListener errorListener=new RequestListener() {
@Override
public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
Log.e("onException",e.toString()+" model:"+model+" isFirstResource: "+isFirstResource);
imageView.setImageResource(R.mipmap.ic_launcher);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
Log.e("onResourceReady","isFromMemoryCache:"+isFromMemoryCache+" model:"+model+" isFirstResource: "+isFirstResource);
return false;
}
} ;
我们看到有两个回调方法,通过onException是图片加载异常回调,onResourceReady是加载成功的回调,具体的读者可以自行打印log查看;
Glide提供了渐入渐出的动画效果的动画效果:
Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").error(R.mipmap.error).placeholder(R.mipmap.place).crossFade(2000).into(imageView);
crossFade内部提供一个int类型的数据,作为这个动画执行的周期时间,当然也可以不填,选择默认的时间,既然可以添加动画,就可以移除,就是调用dontAnimate()方法。
对于任何图像操作,调整大小可能让图片失真。但是我们要尽可能的避免发生这种情况发生。Glide 提供了两个图形装换的操作提供了两个标准选项:centerCrop 和 fitCenter
这个方法是裁剪图片,当图片比ImageView大的时候,他把把超过ImageView的部分裁剪掉,尽可能的让ImageView 完全填充,但图像可能不会全部显示
Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").centerCrop().into(imageView)
Glide加载图片大小是自动调整的,他根据ImageView的尺寸自动调整加载的图片大小,并且缓存的时候也是按图片大小缓存,每种尺寸都会保留一份缓存,当然我们还可以自己定义它的大小,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小
Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").dontAnimate().override(400,600).fitCenter().into(imageView);
//加载Gif文件
Glide.with(context).load("http://i。。。。。.gif").into(imageView);
是不是很简单,依然是一句话就实现显示网络上Gif功能。Glide还提供了Gif相关操作的两个方法。如果我们想将Gif显示成图片的第一帧只需要使用asBitmap()方法即可。如果我们有这个需求,就是严格显示成Gif,那么当传入了一个非Gif 的url时,我们当做错误处理。此时我们可以使用asGif()方法
Glide.with(context).load("http:。。。。。。").asGif().error(R.mipmap.error).placeholder(R.mipmap.place).into(imageView);
Glide 将会把这个 load 当成失败处理。这样做的的好处是,.error() 回调被调用并且错误占位符被显示,如果url是Gif,那么会没什么变化,这样就检查了load参数是否为Gif.
好了,这一片都是简单的方法介绍,后续会继续退出进阶篇和源码篇。