有时候我们要将图片进行缓存,以达到高效处理图片的目的,防止oom问题,你还在自己编写冗杂沉重的代码吗?有时候还需要将图片进行转换,如:剪裁、滤镜、模糊处理等等,你还在自定义view实现它们吗?这时候,我们需要一款强大的图片处理和加载框架:Glide。
- 使用Glide有什么好处呢?
- Glide框架的功能有哪些?
2.可以清除和禁止磁盘缓存
3.可以获取缓存的大小
4.可以指定资源的加载顺序
5.可以先显示缩略图再显示原图来将图片显示出来
6.可以对图片进行裁剪、滤镜、模糊等处理
7.可以对请求资源状态以及网络下载的进度进行监听
- 那么如何使用Glide加载图片呢?
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'jp.wasabeef:glide-transformations:2.0.1'
添加依赖的方式导入Glide方便一点,直接将其复制到app的bulid.grade下dependences下就ok,注意一下,第一个包是glide图片加载框架,第二个是glide图片变换的框架,可以实现裁剪、滤镜等功能。
一般加载图片的实现方法:Glide.with(this).load(uri).into(imageview);
这里用到三个变量:
this:无疑是上下文,可以是activity或者fragment;
uri :是图片的资源路径,可以是网络、本地、系统、raw资源等
imageview:即是图片需要显示的地方,一般为imageview,imagebutton,listview或者RecyclerView的item,整个view等等
这里就直接放上Glide常用的加载图片资源的用法吧:
//(1)加载网络图片
Glide.with(this).load("http://img1.imgtn.bdimg.com/it/u=2615772929,948758168&fm=21&gp=0.jpg").into(ivGlide1);
//(2)加载资源图片
Glide.with(this).load(R.drawable.atguigu_logo).into(ivGlide2);
//(3)加载本地图片
String path = Environment.getExternalStorageDirectory() + "/meinv1.jpg";
File file = new File(path);
Uri uri = Uri.fromFile(file);
Glide.with(this).load(uri).into(ivGlide3);
// (4)加载网络gif
String gifUrl = "http://b.hiphotos.baidu.com/zhidao/pic/item/faedab64034f78f066abccc57b310a55b3191c67.jpg";
Glide.with(this).load(gifUrl).placeholder(R.mipmap.ic_launcher).into(ivGlide4);
// (5)加载资源gif
Glide.with(this).load(R.drawable.loading).asGif().placeholder(R.mipmap.ic_launcher).into(ivGlide5);
//(6)加载本地gif
String gifPath = Environment.getExternalStorageDirectory() + "/meinv2.jpg";
File gifFile = new File(gifPath);
Glide.with(this).load(gifFile).placeholder(R.mipmap.ic_launcher).into(ivGlide6);
//(7)设置缩略图比例,然后,先加载缩略图,再加载原图
String urlPath = Environment.getExternalStorageDirectory() + "/meinv1.jpg";
Glide.with(this).load(new File(urlPath)).thumbnail(0.1f).centerCrop().placeholder(R.mipmap.ic_launcher).into(ivGlide8);
//(9)先建立一个缩略图对象,然后,先加载缩略图,再加载原图
String urlPath = Environment.getExternalStorageDirectory() + "/meinv1.jpg";
DrawableRequestBuilder thumbnailRequest = Glide.with(this).load(new File(urlPath));
Glide.with(this).load(Uri.fromFile(videoFile)).thumbnail(thumbnailRequest).centerCrop().placeholder(R.mipmap.ic_launcher).into(ivGlide9);
- 如何使用glide在RecyclerView中加载图片呢?
这里只放上adapter的代码:
public class GlideRecyclerviewAdapter extends RecyclerView.Adapter<GlideRecyclerviewAdapter.ViewHolder> {
private Context mContext;
/**
* 准备数据
*/
String[] datas = new String[]{
.......数据省略
};
public GlideRecyclerviewAdapter(Context context) {
mContext = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemview = View.inflate(mContext, R.layout.item_glide_recyclerview, null);
return new ViewHolder(itemview);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// 获取当前item数据
Glide.with(mContext)
.load(datas[position])
.placeholder(R.mipmap.ic_launcher) //占位图
.error(R.mipmap.ic_launcher) //出错的占位图
.animate(R.anim.glide_anim)
.centerCrop()
.fitCenter()
.into(holder.image);
}
@Override
public int getItemCount() {
return datas == null ? 0 :datas.length;
}
static class ViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.iv_glide_recyclerview)
ImageView image;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
}
}
}
这样就实现了,可以再为其设置缩略图等属性。
- 如何使用glide实现图片的变化?
主要通过Glide.with(this).load(uri).bitmap.Transform(new xxxTransformation).into(imageview);实现。
由于glide图形变换库里提供了很多变换功能,这里列举几个,其他有需要可以去搜一下:
case 1: {//实现图片的遮盖效果
int width = Utils.dip2px(mContext, 133.33f);
int height = Utils.dip2px(mContext, 126.33f);
Glide.with(mContext)
.load(R.drawable.check)
.override(width, height)
.bitmapTransform(new CenterCrop(mContext),
new MaskTransformation(mContext, R.drawable.mask_starfish))
.into(holder.image);
break;
}
case 2://剪裁圆形的图片
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new CropCircleTransformation(mContext))
.into(holder.image);
break;
case 3://模糊处理
Glide.with(mContext)
.load(R.drawable.check)
.bitmapTransform(new BlurTransformation(mContext, 25))
.into(holder.image);
break;
case 4://灰度处理
Glide.with(mContext)
.load(R.drawable.demo)
.bitmapTransform(new GrayscaleTransformation(mContext))
.into(holder.image);
break;
以下还有很多就不一一介绍了,有需要就自行谷歌一把好了。
补充:本文仅作学习记录以及供大家参考,有不足和改进指出请提出,谢谢。