Glide 图片加载库,作者是 bumptech,这个库被广泛的运用在 google 开源的项目中,也是被 google 官方推荐的库之一,笔者以前使用的图片加载库是 UIL ,但是一个这么强大方便使用的图片加载库,我们是有必要学习使用它,那么现在我们开始我们的学习之旅。
一,导入
使用 Android Studio 作为开发工具,我们只需要在 builde.gradle 里面添加上
compile 'com.github.bumptech.glide:glide:3.7.0'
1.1 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
二,加载图片
1.加载网络图片
1.1.在百度上随便搜索了一个图片地址为:
http://img5.hao123.com/data/desktop/e3c8c371c0e4bc02b7546e625c9bb00c_1366_768
1.2.布局就是一个 ImageView , 很简单代码就不贴出来了。
1.3. Activity 中的代码如下所示:
public class GlideActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.glide);
initview();
}
private void initview(){
ImageView glide = (ImageView) findViewById(R.id.iv_glide);
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.into(glide);
}
}
1.4.加载结果如下图:
运用 Glide 加载图片只需要
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.into(glide);
简单的一行代码就搞定了,比起 UIL 图片加载框架简直是方便太多了,省去了一大堆的配置。
Glide 图片加载库虽然使用起来很方便,短短的几行代码就搞定了加载图片,但是它内部实现机制可是做了大量的事情,比如加载网络图片或是本地图片异或是加载占位图,错误图片加载等等。
那么我们来慢慢的分析学习一下这行代码。
1.4.1.with() 方法可以接收 Context, Activity, Fragment, ApplicationContext, 等参数,而且传入的实例会影响 Glide 加载图片的生命周期,如果传入的是 Activity, Fragment 实例,那么当 Activity, Fragment 视图被销毁的时候,Glide 加载图片也会停止,如果传入的是 ApplicationContext 实例,那么只有该应用被干掉了才会使Glide
加载图片停止。
1.4.2.load() 方法可以接收来自网络的图片,本地资源图片。
load SD卡资源:load("file://"+ Environment.getExternalStorageDirectory().getPath()+"/glide.jpg")
load assets资源:load("file:///android_asset/glide.gif")
load raw资源:load("Android.resource://com.lc.glide/raw/glide")或
load("android.resource://com.lc.glide/raw/"+R.raw.glide)
load mipmap资源:load("android.resource://com.lc.glide/mipmap/glide")或
load("android.resource://com.lc.glide/mipmap/"+R.mipmap.glide)
load http资源:load("http://img5.hao123.com/data/desktop/e3c8c371c0e4bc02b7546e625c9bb00c_1366_768")
1.4.2.1 注意加载SD卡的图片需要SD卡的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1.4.3.into() 传入需要加载图片ImageView的实例就行。
三,占位图
当我们第一次加载网络图片的时候,有些时候加载速度会有点慢,这就导致了加载图片那个 ImageView 控件区域是一个空白,这样对于 APP 的用户体验是非常差的,Glide 为我们考虑了这种情况,就是使用占位图来填充,加载网络图片资源等待的那段时间。
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.placeholder(R.mipmap.ic_launcher)
.into(glide);
添加占位图,就是在 load() 方法后面添加 placeholder() 方法,传入你本地事先准备好的图片资源就行。
四,错误图
错误图的加载时在某种异常情况下导致加载图片失败,这时候我们就可以加载一个错误图来填充加载图片控件位置的空白处,这其中最多的一种情况是用户关了网的情况下(当然是第一次加载网路图片的时候,如果你已经加载过了对应的图片,在第二次打开应用是不会显示错误图的,它会显示你第一次加载的那张图,是因为 Glide 内部它给默认实现了图片的缓存),如下代码所示:
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.error)
.into(glide);
五,图片格式和视频文件
5.1 Glide 图片记载库可以加载 gif 动图,这也是Glide强大的一方面,下面就是加载 gif 格式图片的代码。
Glide.with(this)
.load("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4255309549,1613698538&fm=23&gp=0.jpg")
.asGif()
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.banner)
.into(glide);
在原来的基础上增加一个 asGif() 方法就 OK 了,当然加载静态图片选择方法是 asBitmap() 方法,有兴趣的朋友可以去试试。
5.2 Glide 可以加载视频缩略图
String filePath="storage/emulated/0/Pictures/glide.mp4"
Glide
.with(this).load(Uri.fromFile(new File(filePath)))
.into(glide);
六,缓存
6.1 禁止内存缓存
.skipMemoryCache(true)
6.2 磁盘缓存
磁盘缓存通过 diskCacheStrategy(DiskCacheStrategy) 来设置, DiskCacheStrategy
一共有 4 种模式
DiskCacheStrategy.NONE:什么都不缓存
DiskCacheStrategy.SOURCE:仅缓存原图(全分辨率的图片)
DiskCacheStrategy.RESULT:仅缓存最终的图片,即修改了尺寸或者转换后的图片
DiskCacheStrategy.ALL:缓存所有版本的图片,默认模式
6.4 清除内存缓存
// UI线程中调用
Glide.get(context).clearMemory();
6.5 清除磁盘缓存
// 后台线程中调用,建议同时clearMemory()
Glide.get(applicationContext).clearDiskCache();
七,加载图片的大小
就是在原来的基础上添加一个 override() 方法,如下:
Glide.with(this)
.load("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4255309549,1613698538&fm=23&gp=0.jpg")
.asGif()
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.banner)
.override(100,100)
.into(glide);
八,资源的优先加载顺序:
//先加载
Glide
.with(context)
.load(heroImageUrl)
.priority(Priority.HIGH)
.into(glide1);
//后加载
Glide
.with(context)
.load(itemImageUrl)
.priority(Priority.LOW)
.into(glide2);
9.1 我们在 builde.gradle 里面添加上
compile 'jp.wasabeef:glide-transformations:2.0.0'
添加上依赖之后,我们使用 bitmapTransform() 方法设置图片,或者使用 transform() 方法,而它们都是 GenericRequestBuilder的子类。如下:
- //图片的模糊处理
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.bitmapTransform(new BlurTransformation(this))
.into(glide);
- //图片的圆形处理
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.bitmapTransform(new CropCircleTransformation(this))
.into(glide);
//图片的圆角处理
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.bitmapTransform(new RoundedCornersTransformation(this,50,0, RoundedCornersTransformation.CornerType.ALL))
.into(glide);
等等,如果需要别的操作请查看该依赖库别的 API 。
9.2 如果需要的话,我们也可以自己定义一个 Transformation 来改变图片的形状,下面是我定义的是圆角处理的代码。
public class MyTransform extends BitmapTransformation {
private float radius;
public MyTransform(Context context) {
super(context);
radius=20;
}
public MyTransform(Context context,float radius) {
super(context);
this.radius=radius;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return cornersCrop(pool,toTransform);
}
private Bitmap cornersCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
然后我们直接调用自己定义的这个方法就行了:
Glide.with(this)
.load("http://img3.imgtn.bdimg.com/it/u=227124332,533535715&fm=23&gp=0.jpg")
.bitmapTransform(new MyTransform(this,50))
.into(glide);
我们可以根据具体的实际需求定义我们的 Transformation 来解决实际问题,不过个人还是倾向于调用上面依赖库的方法,看个人喜好吧。
好了,Glide 的介绍及基本使用就学习到这里,下一篇博客,我们去试着学习分析 Glide 的部分源码。