Google推荐的图片加载库,专注于流畅的滚动。
至于Glide的优点大家可以看我另外一篇博客
下面就直接开始Glide的使用
compile 'com.github.bumptech.glide:glide:3.7.0'
然后在需要使用加载图片的地方加入
Glide.with(mContext)
.load(path)
.asGif()
.override(200,200)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.placeholder(R.mipmap.loading_image)
//.thumbnail(1f)
.crossFade()
.error(R.mipmap.error)
.transform(new GlideCircleTransform(mContext))
.into(mImageView);
其中的方法根据自己需要选择使用,是不是觉得很简单呢
- with() 传入对象 Context,Activity,Fragment,Glide会与当前传入值的生命周期一致。
- load() 对象: String(文件路径,网络地址),File(文件资源),Integer(资源id)。
- asGif() 表示的gif动画,asBitmap:表示静态图。
-
diskCacheStrategy() 表示磁盘缓存策略。
1.DiskCacheStrategy.RESULT:展示小大的图片缓存
2.DiskCacheStrategy.ALL; 展示在控件中大小图片尺寸和原图都会缓存
3.DiskCacheStrategy.NONE:不设置缓存
4.DiskCacheStrategy.SOURCE:原图缓存 - override() 设置图片的width,height
- placeholder() 设置占位图
- error() 设置失败图
- thumbnail() 缩略图显示传入值(0-1f)
- crossFade() 显示动画-淡入淡出
- transform() 设置图片圆角或圆形显示(继承 BitmapTransformation)这都是很常用的哦
- centerCrop() 图片显示类型 fitCenter();
- into() 显示到ImageView上
Glide使用案例
- 简单的加载图片实例
Glide.with(this).load(imageUrl).into(imageView);
- 设置加载中以及加载失败图片
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
- 设置跳过内存缓存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
- 设置下载优先级
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
- 设置缓存策略
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
- 设置加载动画
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
- 设置缩略图支持
Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
- 设置监听请求接口
Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
//imageView.setImageDrawable(resource);
return false;
}
}).into(imageView);
- 设置动态转换---显示圆角图/原形图
-- 圆形图
/**
* Glide-所使用显示圆形图片的转换类
*/
static class GlideCircleTransform extends BitmapTransformation {
public GlideCircleTransform(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
然后Glide.with(this).load(imageUrl).transform(new GlideCircleTransform(this)).into(imageView);
-- 圆角图
/**
* Glide-显示圆角图片的转换类
*/
static class GlideRoundTransform extends BitmapTransformation {
private float radius = 0f;
public GlideRoundTransform(Context context) {
this(context, 4);
}
public GlideRoundTransform(Context context, int radiusDp) {
super(context);
this.radius = Resources.getSystem().getDisplayMetrics().density * radiusDp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private Bitmap roundCrop(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(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override
public String getId() {
return getClass().getName() + Math.round(radius);
}
}
然后Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);
使用建议--务必要自己写个ImageLoader类,例如
/**
* 全局的Image显示管理--Glide
* Created by 王元_Trump on 2016/1/24.
*/
public class ImageLoader {
public static final String ANDROID_RESOURCE = "android.resource://";
public static final int IMAGE_LOADING = R.color.light_gray; //loading占位图
public static final int IMAGE_ERROR = R.color.light_gray; //error图
// 将资源ID转为Uri
public static Uri resourceIdToUri(Context mContext, int resourceId) {
return Uri.parse(ANDROID_RESOURCE + mContext.getPackageName() + "/" + resourceId);
}
// 加载网络图片
public static void displayByUrl(Context mContext, String url, ImageView imageView) {
Glide.with(mContext)
.load(url)
.placeholder(IMAGE_LOADING)
.error(IMAGE_ERROR)
.crossFade() //淡入淡出
.into(imageView);
}
// 加载drawable图片
public static void displayByRes(Context mContext, int resId, ImageView imageView) {
Glide.with(mContext)
.load(resourceIdToUri(mContext, resId))
.placeholder(IMAGE_LOADING)
.error(IMAGE_ERROR)
.crossFade()
.into(imageView);
}
// 加载本地图片
public static void displayByLocal(Context mContext, String path, ImageView imageView) {
Glide.with(mContext)
.load("file://" + path)
.placeholder(IMAGE_LOADING)
.error(IMAGE_ERROR)
.crossFade()
.into(imageView);
}
}
设置Glide显示的Bitmap格式,默认是RGB_565
第一步
public class GlideConfiguration implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//设置图片的显示格式ARGB_8888
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//设置磁盘缓存目录
//StringdownloadDirectoryPath=Environment.getExternalStorageDirectory() +Contents.MY_GLIDE_DISK;
//int cacheSize100MegaBytes = 100000000;
//glideBuilder.setDiskCache( new DiskLruCacheFactory(downloadDirectoryPath, cacheSize100MegaBytes) );
}
@Override
public void registerComponents(Context context, Glide glide) {
// register ModelLoaders here.
}
}
第二步
在AndroidManifest.xml中定义meta-data
<meta-data
android:name=".config.GlideConfiguration"
android:value="GlideModule"/>
Glide使用中常见的问题
一、为什么 有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片呢?
- 方案一: 不设置占位
- 方案二:使用如下的代码加载图片:
Glide.with(mContext)
.load(url)
.placeholder(R.drawable.loading_spinner)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// setImageBitmap(bitmap) on CircleImageView
}
};
- 方案三:使用Glide的Transformation API自定义圆形Bitmap的转换。(如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话)
二、为什么会偶尔看到类似于"You cannot start a load for a destroyed activity"的异常呢?
- 当你的图片还在loaidng, 或者你在asynctask里面的 post 里去 加载图片,当async 还在跑时, 你back, finish 了你的activity,那么就报错了。所以请记住一句话: 不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext()。这里是解决方案
另外Glide还提供了清除缓存的实现
- Glide.get(context).clearDiskCache();(清除磁盘缓存) 必须在子线程
- Glide.get(context).clearMemory();(清除内存缓存) 必须在主线程