第三方库Glide

glide是一个图片加载的库

依赖 compile ‘com.github.bumptech.glide:glide:3.7.0’

使用glide很简单就是简简单单的一句

1
2
3
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.into(image);

with(Context context):Context支持 Activity Context Fragment FragmentActivity中四种类型
load():支持网络资源、assets资源、Resources资源、File资源、Uri资源、字节数组
into():在哪个imageview中显示



glide可以加载的资源类型

1
2
3
4
5
Glide.with(this).load("http://pic9/258/a2.jpg").into(iv);    //网络资源
Glide.with(this).load("file:///xxx.jpg").into(iv); //file文件
Glide.with(this).load(R.mipmap.ic_launcher).into(iv); //资源文件
Glide.with(this).load(uri).into(iv); //uri资源
Glide.with(this).load(byte[]).into(iv); //byte数组

不仅如此glide还可以加载动静态的gif

1
2
Glide.with(this).load(imageUrl).asBitmap().into(iv); //静态gif  其实就是一张图片
Glide.with(this).load(imageUrl).asGif().into(iv); //动态gif

还可以加载本地的一个视频

1
2
String filePath = "/storage/emulated/0/Pictures/example_video.mp4";  //视频路径
Glide.with(context).load(Uri.fromFile(new File( filePath))).into(iv);

我们有时候加载网络图片可能会失败,这时候我们可以设置一个加载失败的图片

1
2
3
4
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.error("R.drawable.error") //加载错误的图片
.into(image)

当图片真在加载的时候如果什么都没有,会让用户感觉非常不好,这是我们可以设置一个正在加载时显示的图片

1
2
3
4
5
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.error("R.drawable.error") //加载错误或失败后显示的图片
.placeholder(R.drawable.load) //正在加载时试显示的图片
.into(image)

还可以设置先加载缩略图

1
2
3
4
5
6
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.error("R.drawable.error") //加载错误或失败后显示的图片
.placeholder(R.drawable.load) //正在加载时试显示的图片
.thumbnail(0.1f) //加载缩略图
.into(image)

我们还可以设置加载的动画,这个动画默认是淡入淡出

1
2
3
4
5
6
7
8
9
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.error("R.drawable.error") //加载错误或失败后显示的图片
.placeholder(R.drawable.load) //正在加载时试显示的图片
.thumbnail(0.1f) //加载缩略图
.crossFade(1000) // 可设置时长,默认“300ms”
//.animate(R.anim.fade_in)设置自定义的动画
//.dontAnimate() 可以去除动画
.into(image)

有时候我们需要去设置图的大小,除了自己去设置,Glide还给我们提供了两种缩放方法

1
2
3
4
5
6
7
8
9
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.error("R.drawable.error") //加载错误或失败后显示的图片
.placeholder(R.drawable.load) //正在加载时试显示的图片
.thumbnail(0.1f) //加载缩略图
.override(width,height) //图片显示的分辨率 ,像素值 可以转化为DP再设置
//.centerCrop() CenterCrop 即缩放图像至填充到 ImageView内,裁剪额外的部分。ImageView会完全填充,但图像可能不会显示不全
//.fitCenter() fitCenter() 图片会按照imageview长宽中最小的边界作为依据,按比例缩放图像。该图像将会完全显示,但可能不会填满整个 ImageView。
.into(image)

Glide还给我们提供了缓存的策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Glide.with(this)
.load("http://nm/photo/1f/1f7a.jpg")
.skipMemoryCache(true) //跳过缓存
.into(iv);

//设置缓存
Glide.with(this)
.load("http://nm/photo/1f/1f7a.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(iv);
//DiskCacheStrategy.ALL 缓存源资源和转换后的资源
//DiskCacheStrategy.NONE 不做任何磁盘缓存
//DiskCacheStrategy.RESULT 缓存转换后的资源
//DiskCacheStrategy.SOURCE 缓存源资源

/**还提供了清理缓存的方法**/
Glide.get(this).clearDiskCache();//在子线程中进行
Glide.get(this).clearMemory();//可以在主线程
//获取文件缓存的路径,拿到路径之后我们就能够加载出缓存的图片
Glide.with(context).load(imgUrl).downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get();

还可以自己设置缓存的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class GlideModuleConfig implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//内部存储/Android/data/包名/cache/glide-images
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "glide-images", 2 * 1024 * 1024));
//将默认的RGB_565效果转换到ARGB_8888
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}

@Override
public void registerComponents(Context context, Glide glide) {
//不做处理
}
}

然后在配置文件中配置,application节点下

1
2
3
<meta-data
android:name="包名.widget.GlideModuleConfig"
android:value="GlideModule" />

同时我们还可设置图片的模糊度,像下面这样,这时我们需要在另外导入一个依赖,这是一个模糊的依赖

依赖compile ‘jp.wasabeef:glide-transformations:2.0.1’


1
2
3
4
5
6
7
8
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.error("R.drawable.error") //加载错误或失败后显示的图片
.placeholder(R.drawable.load) //正在加载时试显示的图片
.thumbnail(0.1f)
// “23”:设置模糊度(在0.0到25.0之间),默认”25";"4":图片缩放比例,默认“1”。
.bitmapTransform(new BlurTransformation(context,23,4)) //模糊
.into(image)

利用这个库还可以进行裁剪圆角等

1
2
3
4
5
6
7
8
9
10
//原图基础上变换设置圆形图
Glide.with(context).load(url).bitmapTransform(new CropCircleTransformation(this)).into(iv);
//原图基础上变换成圆图 +毛玻璃(高斯模糊)
Glide.with(this).load(url).bitmapTransform(new BlurTransformation(this, 25), new CropCircleTransformation(this)).into(iv);
//y圆角
//如果是四周已经是圆角则RoundedCornersTransformation.CornerType.ALL
Glide.with(this)
.load(url)
.bitmapTransform(new RoundedCornersTransformation(this, 30, 0, RoundedCornersTransformation.CornerType.BOTTOM))
.into(iv);

同时我们还可以对加载进行监听,注意:如果需要加载完成后设置图片透明度为0,则不能设置.placeholder(R.drawable.url),否则达不到你想要的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Glide.with(this)
.load("http://ww4.sinaimg.cn/large/610dc034gw1f96kp6faayj20u00jywg9.jpg")
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
Toast.makeText(getApplicationContext(),"资源加载异常",Toast.LENGTH_SHORT).show();
return false;
}
//这个用于监听图片是否加载完成
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
Toast.makeText(getApplicationContext(),"图片加载完成",Toast.LENGTH_SHORT).show();
return false;
}
})
.into(image)