由于项目使用到了Glide4.0+强大的图片加载库,深入理解一下Glide4.0+。
Glide4.0+地址
一、引入
//allprojects下的
repositories {
mavenCentral()
maven { url 'https://maven.google.com' }
}
dependencies {
compile 'com.github.bumptech.glide:glide:4.6.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
}
注意:这里可能会产生一个依赖(Support Library Version)重复的坑。
Glide对Android SDK进行了要求。minSdkVersion >= 14
compileSdkVersion 需要使用API 27(Oreo)或者更高的sdk版本来编译
Support Library Version - Glide 使用的支持库版本为 27。如需使用不同于v27的库,可以通过下面的方式:
dependencies {
implementation ("com.github.bumptech.glide:glide:4.6.1") {
exclude group: "com.android.support"
}
implementation "com.android.support:support-fragment:26.1.0"
}
二、简单使用
1,链式调用
在项目中新建一个java类,添加@GlideModule
和继承AppGlideModule
(如下),
@GlideModule
public class MyGlide4 extends AppGlideModule {
}
就可以使用GlideApp的链式调用:
GlideApp.with(content)
.load(myUrl)
.placeholder(placeholder)
.fitCenter()
.into(imageView);
2,占位符
Glide的占位符分为以下三种:
- 占位符(Placeholder):请求过程中显示
占位符是当请求正在执行时被展示的 Drawable 。当请求成功完成时,占位符会被请求到的资源替换。
GlideApp.with(context)
.load(url)
.placeholder(new ColorDrawable(Color.BLACK))//接收Drawable 和 @DrawableRes int id两种类型
.into(view);
- 错误符(Error):请求失败时显示。
error Drawable
在请求永久性失败时展示。error Drawable 同样也在请求的url/model为 null ,且并没有设置 fallback Drawable 时展示。
GlideApp.with(this)
.load(movieDetailBean.getImages().getSmall())
.placeholder(R.drawable.ic_image_fail)
.error(R.drawable.ic_image_fail)
.into(mMovieDetailTopIv);
在Glide4.3+版本,可以使用error
API,通过一个新RequestBuilder
的进行失败后的重新加载。
例如:请求url,失败后加载failUrl
GlideApp.with(context)
.load(url)
.error(Glide.with(fragment)
.load(failUrl))//失败后,重新加载
.into(imageView);
注:如果主的请求成功,该error
不会执行,如果指定缩略图thumbnail
,即便缩略图请求成功(主请求未成功),也会执行error
。
- 后备回调符(Fallback)
fallback Drawable
在请求的url/model为 null 时展示。设计fallback Drawable
的主要目的是允许用户指示 null 是否为可接受的正常情况。例如,一个 null 的个人资料 url 可能暗示这个用户没有设置头像,因此应该使用默认头像。然而,null 也可能表明这个元数据根本就是不合法的,或者取不到。 默认情况下Glide将 null 作为错误处理,所以可以接受 null 的应用应当显式地设置一个fallback Drawable
。
GlideApp.with(fragment)
.load(url)
.fallback(new ColorDrawable(Color.GREY))
.into(view);
3,过渡选项
TransitionOptions 用于决定你的加载完成时会发生什么。
使用 TransitionOption
可以应用以下变换(如果不使用的话,从占位符(Placeholder)会直接跳转到下个要显示的图像):
- View淡入
- 与占位符交叉淡入
例如:淡入变换
GlideApp.with(this)
.load(movieDetailBean.getImages().getSmall())
.transition(withCrossFade())//需要导包
.error(R.drawable.ic_image_fail)
.into(mMovieDetailTopIv);
//需要导入
import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;
注:这里使用的是DrawableTransitionOptions
,如果请求加载一个Bitmap
的时候,需要使用 BitmapTransitionOptions
.
4,thumbnail 缩略图
thumbnail()
API 对本地和远程图片都适用,尤其是当低分辨率缩略图存在于 Glide 的磁盘缓存时,它们将很快被加载出来。
缩略图使用方式1:
GlideApp.with(context)
.load(url)
.thumbnail(Glide.with(context).load(thumbnailUrl))//这里加载网络缩略图(此时两个url不同)
.into(imageView);
注:如果主要的请求在缩略图请求之前完成,那么缩略图将不再显示。
缩略图使用方式2:
如果没有缩略图的url,可以使用Glide
中的override
或 sizeMultiplier
API 来强制 Glide 在缩略图请求中加载一个低分辨率图像:
- 使用
override
int thumbnailSize = ...;
GlideApp.with(this)
.load(url)
.thumbnail(GlideApp.with(this)
.load(url)//这里是同一个url
.override(thumbnailSize))//这里加载网络缩略图,并设置size
.into(imageView);
-推荐使用:sizeMultiplier
它只需要一个 sizeMultiplier
参数。如果你只是想为你的加载相同的图片,但尺寸为 View
或 Target
的某个百分比的话特别有用
GlideApp.with(this)
.load(url)
.thumbnail(0.2f)//这里加载网络图的0.2作为缩略图
.into(imageView);
5,变换
在Glide中,Transformations 可以获取资源并修改它,然后返回被修改后的资源。通常变换操作是用来完成剪裁或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型。
内置变换类型
- CenterCrop
- FitCenter
- CircleCrop
推荐使用GlideApp进行链式调用。如下:
GlideApp.with(this)
.load(url)
.centerCrop()
//.circleCrop()
//.fitCenter()
.into(imageView);
注:如果进行多次变换,每个 transform()
调用,或任何特定转换方法(fitCenter()
, centerCrop()
, bitmapTransform()
)的调用都会替换掉之前的变换。如果想要多重变换,需要使用MultiTransformation
6,缓存配置
- 磁盘缓存策略(Disk Cache Strategy)
默认的策略叫做
AUTOMATIC
,它会尝试对本地和远程图片使用最佳的策略。当你加载远程数据(比如,从URL下载)时,AUTOMATIC
策略仅会存储未被你的加载过程修改过(比如,变换,裁剪–译者注)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。
指定方法:
-
仅从缓存加载图片
如果图片不再缓存,那么就会加载失败。
GlideApp.with(fragment)
.load(url)
.onlyRetrieveFromCache(true)//仅从缓存加载
.into(imageView);
-
跳过缓存
1,跳过内存skipMemoryCache()
GlideApp.with(fragment)
.load(url)
.skipMemoryCache(true)//跳过内存缓存
.into(view);
2,跳过磁盘缓存:DiskCacheStrategy.NONE
GlideApp.with(fragment)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(view);
注:以上两个可以同时使用,但是不建议这样做,因为每次都会重新请求,效率和流量.....