简介
是一个快速高效的Android开源媒体管理和图像加载框架,它将媒体解码、内存和磁盘缓存以及资源池封装到一个简单易用的界面中。
Glide支持拉取,解码和展示视频快照,图片和GIF动画。
**优点:**1.使用简单,并且支持多种图片格式,既可以获取网络资源又可以获取本地资源,不用处理网络请求、缓存、内存管理、图片解码等复杂逻辑;
2.性能优秀:自动管理 Bitmap 内存,防止内存溢出,可以自动根据ImageView调整图片大小,节省内存。
所需权限
网络加载
通过网络连接加载图像,需要添加INTERNET 和ACCESS_NETWORK_STATE权限
xml
<manifest>
...
<uses-permission android:name="android.permission.INTERNET"/>
<!--允许Glide监视连接状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
...
</manifest>
本地存储
要从DCIM或图片等本地文件夹加载图像,需要添加READ_EXTERNAL_STORAGE权限
xml
<manifest>
...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>
要将Glide的缓存存储到公共sdcard上,需要使用WRITE_EXTERNAL_STORAGE权限
xml
<manifest>
...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
</manifest>
基本用法
在build.gradle中添加依赖
java
implementation 'com.github.bumptech.glide:glide:4.12.0'
- **with(Context context)**可以传递Activity/Fragment,并且它会和所传参数的生命周期进行绑定
- **load(String imageUrl)**加载图片,传入的是图片的URL地址
- placeholder 占位符是在请求正在进行时,显示的图片
- error 表示请求失败时,会显示设置的图片
- fallback 表示传递的是null值时,会显示设置的图片
- into(ImageView targetImageView) 传入要展示图片的控件
- transform 用来完成剪裁(切圆)或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型
- override 将图片大小调整为给定的尺寸(以像素为单位),调整大小不考虑纵横比
- transition 控制图片加载完成后的过渡动画效果
简单使用
加载图片
java
Uri uri=Uri.parse("https://th.bing.com/th/id/R.c0b37497ff48b914ae99c7dcdcf7b95d?rik=HUXUOfyLgw7hHA&pid=ImgRaw&r=0");
//加载网络图片
Glide.with(this).load(uri).into(imageView);
//应用资源
Glide.with(this).load(R.drawable.image1).into(imageView);
//加载圆形图片
Glide.with(this).load(uri).circleCrop().into(imageView);
//增加占位符和加载失败显示图片
Glide.with(this)
.load(uri)
.placeholder(R.drawable.image1)
.error(R.drawable.image1)
.fallback(R.drawable.image1)
.into(imageView);
//图片大小调整
Glide.with(this).load(uri).override(600,200).into(imageView);
缩放图片
对于任何图像的任何处理,调整图像的大小可能会扭曲长宽比,丑化图片的显示。
Glide提供了变换去处理图片显示
centerCrop():会缩放图片,让图片充满整个ImageView的边框,然后裁掉超出的部分,ImageView会被完全填充满,但是图片可能不能完全显示fitCenter():会缩放图片让两边都相等或小于ImageView的所需求的边框,图片会被完整显示但可能不会填满整个ImageView
java
Glide.with(this).load(uri).override(600,200).centerCrop().into(imageView);
Glide.with(this).load(uri).override(600,200).fitCenter().into(imageView);
图片过渡
使用crossfade动画可以使改变图片的效果变得更加平滑
java
Glide.with(this)
.load(uri)
.placeholder(R.drawable.image1)
.error(R.drawable.image1)
.transition(DrawableTransitionOptions.withCrossFade())//withCrossFade(int duration)方法可以传入时间,默认时间是300毫秒
.into(imageView);
除此之外,Glide还支持xml中自定义的动画文件
java
Glide.with(this)
.load(uri)
.transition(GenericTransitionOptions.with(R.anim.zoom_in))
.into(imageView);
加载gif
java
String gifUrl="https://i-blog.csdnimg.cn/blog_migrate/c0a5b53d30d8e1c25ea014b113b66fdf.gif";
Glide.with(this).load(gifUrl).into(imageView);
还可以使用asGif()强迫生成一个gif
java
Glide.with(this).asGif().load(gifUrl).error(R.drawable.image1).into(imageView);
如果只想显示gif的第一帧图片,可以调用asBitmap()将其作为常规图片显示
java
Glide.with(this).asBitmap().load(gifUrl).into(imageView);
显示本地视频缩略图
java
String filePath = "/storage/emulated/0/Pictures/targetVideo.mp4";
Glide.with(this)
.asBitmap()
.load(Uri.fromFile(new File(filePath)))
.into(imageView);
取消加载
java
Glide.with(this).clear(imageView);
注意:及时取消加载不是必须的操作,实际上,当Glide.with()中传入的Activity或Fragment实例销毁时,Glide会自动取消加载并回收资源。
高斯模糊
使用库
java
implementation 'jp.wasabeef:glide-transformations:4.3.0'
简单使用
java
public static void loadImageViewTransform(Context mcontext, byte[] path, ImageView imageView){
//前一个参数为圆角,后一个为模糊值,越大越模糊
BlurTransformation blurTransformation=new BlurTransformation(10,15);
Glide.with(mcontext).load(path)
.apply(RequestOptions.bitmapTransform(blurTransformation))
.into(imageView);
}
组合使用
高斯模糊可以和各种效果组合
java
@GlideOption
public static BaseRequestOptions<?> applyBlurHead(BaseRequestOptions<?> options,int size){
//高斯模糊
BlurTransformation blurTransformation=new BlurTransformation(20,1);
//高斯模糊和切圆组合
return options.override(size)
.placeholder(R.drawable.image1)
.error(R.drawable.ic_launcher_background)
.transform(new MultiTransformation<>(blurTransformation,new CircleCrop()));
}
注意:默认情况下,对每一个后续呼叫transform()或任何特定的transform方法(fitCenter(),centerCrop(),bitmapTransform()等)将取代先前的transform。
要将多个转换应用于单个加载,可使用MultiTransformation类
自定义API
可以通过Glide提供的注解,来添加自己定义的API
-
GlideModule注解用于AppGlideModule
-
GlideExtension注解用于表示一个扩展Glide API的类,任何拓展的Glide API的类都必须使用这个注解来标记,被@GlideExtension注解的类以工具类的方式实现
被@GlideExtension注解的类有两种扩展方式:
- GlideOption-注解为RequestOptions添加一个选项
- GlideType-添加新的资源类型的支持(GIF,SVG等)
首先添加Glide注解处理器配置
xml
annotationProcessor "com.github.bumptech.glide:compiler:4.12.0"
项目需要通过GlideModule注解继承子AppGlideModule类的子类,并通过GlideExtension注解到工具类上来扩展自定义GlideAPI。
使用GlideOption和GlideType注解的方法必须为静态方法,经过Rebuild Project之后,最后会被编译到XXXRequest.java类
java
//Application模块内,GlideModule注解自定义子类继承AppGlideModule,可以不用重写任何方法
@GlideModule(glideName = "GlideApp")
public class MyGlideModule extends AppGlideModule {
public void applyOptions(Context context, GlideBuilder builder){
//可以添加一些全局性的options
super.applyOptions(context, builder);
}
}
@GlideExtension
public class MyGlideExtensions {
private MyGlideExtensions(){
}
//GlideOption注解,添加自定义的Option
@GlideOption
public static BaseRequestOptions<?> mMiniThunb(BaseRequestOptions<?> options,int size){
return options.fitCenter().override(size);
}
private static final RequestOptions DECODE_TYPE_GIF=RequestOptions.decodeTypeOf(GifDrawable.class);
//GlideType注解,添加自定义的资源类型
@GlideType(GifDrawable.class)
public static RequestBuilder<GifDrawable> asMyGif(RequestBuilder<GifDrawable> requestBuilder){
return requestBuilder
.transition(new DrawableTransitionOptions())//设置用于在加载完成时从占位符到正常显示的过渡效果
.apply(DECODE_TYPE_GIF);// 将自定义的ResourceClass设置到resourceClass参数
}
}
//使用自定义API
GlideApp.with(this)
.asMyGif()//使用自定义的资源
.load(gifUrl)
.mMiniThunb(600)//使用自定义的Option
.into(imageView);