前言
- 在这里主要是讲3.7的用法,4.0以上的请转换别的博客
- 大部分现在主流用的最多的版本是3.70
介绍
- Glide,是一种快速、高效的图像加载框架,提供了易用的API,高性能、可扩展的图片解码管道,以及自动的资源技术
- Glide支持拉取,解码和展示视频快照,静态图片和动态图片,默认情况下,Gilde使用的是一个定制化的基宇HttpUrlConnection的栈,并且Google提供了和Volley、Okhttp快速集成的工具库,几乎满足一切需求
使用
(一)导入
- 在AndroidStudio添加依赖
dependencies {
implementation 'com.android.support:appcompat-v7:26.1.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
}
- Maven形式
<dependency>
<groupId>com.github.bumptech.glide</groupId>
<artifactId>glide</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>support-v4</artifactId>
<version>r7</version>
</dependency>
- 如果是Eclipse使用去下载Glide的jar在项目中使用就可以了,jar的链接https://github.com/bumptech/glide/releases
(二)基础使用
1.基本用法
Gilde请求至少需要三个参数,代码如下:
Glide.with(activity/fragment)
.load(url)
.into(imageView);
with()生命周期跟Activity和Fragment保持一致,所以建议用她们的对象,而不是Context
2.占位图
有时候会因为网络差或者手机的问题,图片无法立即显示出来,为了让UI更加好看一些,我们会使用占位图,Glide为我们提供了placeHolder()和error()
Glide.with(context)
.load(url)
.placeholder(R.drawable.place_image)//图片加载出来前,显示的图片
.error(R.drawable.error_image)//图片加载失败后,显示的图片
.into(imageView)
注意: placeholder() 和 error() 的参数都是只支持 int 和 Drawable 类型的参数,这种设计应该是考虑到使用本地图片比网络图片更加合适做占位图。
3.缩略图
//这点有疑问
它可以从网络中加载,会在事件请求加载完成或者处理完之后显示,在原始图片到达之后,缩略图不会取代原始图片,只会被抹除
提供了两种加载方式,比较简单用thumbnail()方法,参数是float类型,为倍数,比如0.5f,Glide将显示原图片的50%大小
Glide.with( context )
.load( url )
.thumbnail( 0.5f )
.into( imageView );
如果缩略图是通过网络加载相同的全尺寸图片,就不会很快显示,所以提供了另一种方式去加载略缩图
DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( url );
Glide.with( context )
.load( url )
.thumbnail( thumbnailRequest )
.into( imageView );
4.动画开关
动画效果可以让图片加载的更加平滑,crossFade()方法默认强制开启淡出淡入的效果,它有一个重载方法crossFade(int duration),可以控制动画的持续时间,默认是300ms,并且还提供了关闭效果的方法dontAnimate()
Glide.with(context)
.load(url)
.crossFade()//或者使用 dontAnimate() 关闭动画
.placeholder(R.drawable.place_image)
.error(R.drawable.error_image)
.into(imageView);
注意: 可以自定义动画效果
5.图片大小与裁剪
可以指定图片大小,在图片显示到ImageView之前,重新改变,这是因为从服务器获取的图片不一定都是符合设计图的 标准
Glide.with(context)
.load(url)
.override(width,height)//这里的单位是px
.into(imageView);
Glide提供了类似ScaleType属性,两个方法CenterCrop()、FitCenter(),CenterCrop() 方法是将图片按比例缩放到足矣填充 ImageView 的尺寸,但是图片可能会显示不完整;而 FitCenter() 则是图片缩放到小于等于 ImageView 的尺寸,这样图片是显示完整了,但是 ImageView 就可能不会填满了。
CENTER_CROP 和 FIT_CENTER
6.图片的缓存处理
- 内存缓存
.skipMemoryCache(true) 跳过内存缓存,默认有内存缓存 - 磁盘缓存
// 跳过磁盘缓存
Glide.with(context)
.load(url)
.skipMemoryCache(true)
.diskCacheStrategy( DiskCacheStrategy.NONE )
.into(imageView);
- 自定义磁盘缓存行为
DiskCacheStrategy 的枚举意义:
DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 只缓存全尺寸图
DiskCacheStrategy.RESULT 只缓存最终的加载图
DiskCacheStrategy.ALL 缓存所有版本图(默认行为) - 清理磁盘缓存
// 必须在后台线程中调用,建议同时clearMemory()
Glide.get(this).clearDiskCache();
7.图片请求的优先级
同一时间加载多个图片,如果APP主页有广告轮播和列表图片,希望广告轮播的图片优先显示,那么可以调用.priority()方法配合Priority枚举来设置图片加载的优先级
//设置 HIGH 优先级
Glide.with( context )
.load( highPriorityImageUrl )
.priority (Priority.HIGH )
.into( imageView );
//设置 LOW 优先级
Glide.with( context )
.load( lowPriorityImageUrl )
.priority( Priority.LOW )
.into( imageView );
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIAT
优先级并不是遵守严格,会尽可能的去处理请求,不能保证所有的图片按照所有要求去顺序加载
8.显示 Gif 和 Video
设置Gif动态图片
Glide.with( context )
.load( gifUrl )
.asGif()
.error( R.drawable.error )
.into( imageView );
设置Gif图片第一帧静态图片
Glide.with( context )
.load( gifUrl )
.asBitmap()
.error( R.drawable.error )
.into( imageView );
设置视频但是只能是手机本地的视频
String filePath = "/storrage/emulated/0/Video/video.mp4";
Glide.with( context )
.load( Uri.fromFile( new File( filePath ) ) )
.into( imageView );
(三)进阶使用
Target篇
可以简单的理解为它是一个接口,Glide为我们提供了很多Target
SlimpleTarget
最主要可以创建属于他们独立的生命周期,使用context.getApplicationContext() 的上下文,这样只有在应用完全停止时 Glide 才会杀死这个图片请求
new SimpleTarget(500,500),可以指定尺寸大小,
private SimpleTarget<Bitmap> mSimpleTarget = new SimpleTarget<Bitmap>(500,500) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> animation) {
mImageView.setImageBitmap(resource);
}
};
private void loadImageSimpleTarget() {
Glide.with(context.getApplicationContext())
.load(url)
//防止加载到gif图片发生冲突
.asBitmap()
.into(mSimpleTarget);
}
- ViewTarget
自定义View时,Glide不支持加载图片到自定义Vie中,使用它会更容易实现
Transformations篇
图片显示之前对图片进行处理操作的功能 调用.transform()方法,将自定义的Transformations对象作为参数传递进去就可以使用了,还可以使用.
直接使用glide-transformations 图片处理库,它提供了很多Transformations的实现 .bitmaoTransform() 但是它只能用于 bitmap 的转换
Animate篇
- 从图像到图像的平滑过渡可以更好的显示,我们如果想要设置自己的动画:
//创建一个动画文件
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<scale
android:duration="@android:integer/config_longAnimTime"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1"/>
</set>
Glide.with(context)
.load(mUrl)
.transform(new RoundTransformation(this , 20))
.animate( R.anim.donghua)
.into(mImageView);
- 这种加载方式在常规的ImageView上是没有问题,如果使用使用是后缀名Target类一些自定义的时候,需要传入ViewPropertyAnimation.Animator 接口的类对象来实现:
ViewPropertyAnimation.Animator animator = new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) {
view.setAlpha( 0f );
ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f );
fadeAnim.setDuration( 2500 );
fadeAnim.start();
}
};
然后,我们只需要在 Glide 请求中设置这个动画对象就ok了
Glide.with(context)
.load(mUrl)
.animate( animator )
.into(viewTarget);
Modules篇
定制Gilde的行为,相当于自己可以随意改造变成自己需求的东西,为了定制 Glide 的行为我们要去实现 interface GlideModule
注意: 需要在Mainfast.xml注册 声明
总结
自己封装了一个工具类,这是github地址,要养成一个好习惯,把自己用过的框架自己封装一个工具类