公司最近搞技术分享,看着后端大佬们都是源码阅读,真真厉害,我很慌。今天尝试阅读了Glide的源码,没怎么看懂,所以这篇文章是结合工作中遇到的图片加载的各类需求,记录Glide的基础用法,方便后续使用,源码篇会在后续充分了解了重新开一篇。
Glide相关信息
- github地址:
github.com/bumptech/gl… - 中文说明文档:
muyangmin.github.io/glide-docs-…
项目引用Glide
在项目的Build.gradle(app)文件中添加如下代码:
repositories {
google()
jcenter()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
涉及权限
网络权限,用URL或一个网络连接中加载数据需要。
网络状态权限,便于从URL加载图片时,可自动处理片状网络连接。
读取权限,用于读取本地文件。
存储权限,使用ExternalPreferredCacheDiskCacheFactory将缓存存储到公有SD卡。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
混淆配置
#===================glide===================
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule {
<init>(...);
}
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {
*** rewind();
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
不同图片需求如何使用
基础使用
一般的图片资源,比如资源文件,网络图片等,使用方法如下:
/**
* 基础使用
* this---上下文
* R.mipmap.pic---图片资源(资源文件,GIF图片,网络图片等)
* mBinding.ivOne---ImageView控件
*/
private void basic() {
Glide.with(this).load(R.mipmap.pic).into(mBinding.ivOne);
}
指定GIF图片
使用asGif(),图片资源必须是GIF格式,不然无法正常显示,代码如下:
/**
* 指定GIF图片
* 注:只能使用GIF格式的图片,不然无法显示
* this---上下文
* asGif()---设置为GIF
* R.mipmap.gif---动态图片资源
* mBinding.ivTwo---ImageView控件
*/
private void basicWithGif() {
Glide.with(this).asGif().load(R.mipmap.gif).into(mBinding.ivTwo);
}
指定占位符
占位符分为三种,分别是占位符(Placeholder),错误符(Error) ,后备回调符(Fallback)。
占位符(Placeholder)
显示在请求到资源之前,若请求资源为空且未设置错误符和后备回调符则会一直显示。
/**
* 占位符(Placeholder)
* 显示在请求到资源之前,若请求资源为空且未设置错误符和后备回调符则会一直显示。
* .placeholder(new ColorDrawable(Color.GRAY))设置为灰色背景
* .placeholder()--参数为int或者Drawable
*/
private void basicWithPlaceholder() {
Glide.with(this).load("").placeholder(new ColorDrawable(Color.GRAY)).into(mBinding.ivThree);
}
错误符(Error)
显示在请求资源失败后,若请求资源为空且未设置后备回调符则会显示。
/**
* 错误符(Error)
* 若请求资源失败或者为空且未设置后备回调符则会显示。
* .error(new ColorDrawable(Color.RED))设置失败为红色背景
* .error()--参数为int或者Drawable
*/
private void basicWithError() {
Glide.with(this).load("").error(new ColorDrawable(Color.RED)).into(mBinding.ivFour);
}
后备回调符(Fallback)
显示在请求资源为空后,则设置默认显示的资源。
/**
* 后备回调符(Fallback)
* 显示在请求资源为空后,则设置默认显示的资源。
* .fallback(R.mipmap.no_data)设置为默认的没有数据的图片
* .fallback()--参数为int或者Drawable
*/
private void basicWithFallback() {
Bitmap bitmap = null;
Glide.with(this).load(bitmap).fallback(R.mipmap.no_data).into(mBinding.ivFive);
}
变换
RequestOptions
根据其规则设置填充方式,或者圆角度等基础的图片变换达到场景需求,比如圆形头像。
/**
* RequestOptions
* 带有特殊处理的图片选项,例如填充方式,圆形,Corners(角弧度)等
*/
private void basicWithRequestOptions() {
//圆形图片
RequestOptions circle = RequestOptions.circleCropTransform();
Glide.with(this).applyDefaultRequestOptions(circle).load(R.mipmap.pic).into(mBinding.ivSix);
//圆形图片
// Glide.with(this).load(R.mipmap.pic).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(mBinding.ivSix);
//填充方式,中间剪切 高度改为宽度一半看效果
// Glide.with(this).load(R.mipmap.pic).centerCrop().into(mBinding.ivSix);
//角弧度
// RoundedCorners roundedCorners = new RoundedCorners(100);
// RequestOptions options = RequestOptions.bitmapTransform(roundedCorners);
// Glide.with(this).load(R.mipmap.pic).apply(options).into(mBinding.ivSix);
}
过渡选项TransitionOptions
控制资源文件载入时的效果
/**
* 过渡选项
* 即图片载入时的动画效果
* DrawableTransitionOptions普通图片
* BitmapTransitionOptions请求Bitmap时使用
*/
private void basicWithTransitionOptions() {
//交叉淡入 load()中加入网络图片地址,效果明显
Glide.with(this).load("").transition(withCrossFade()).into(mBinding.ivSeven);
}
缩略图Thumbnail
图片软件中常用到先加载一张缩略图,然后网络加载完原图后替换缩略图,这样做的效果时,用户可以先看到图片内容,不至于是一片空白,加强交互效果。
/**
* 缩略图
* 用于加载高质量图片之前加载
* 两种方法,一种是后端提供缩略图和原图;一种是只有原图的情况下,设置缩略比例。
*/
private void basicWithThumbnail() {
// Glide.with(this).load("原图地址").thumbnail(Glide.with(this).load("缩略图地址")).into(mBinding.ivEight);
Glide.with(this).load("原图地址").thumbnail(0.25f).into(mBinding.ivEight);
}
缓存
分为两种:磁盘缓存和内存缓存。
/**
* 缓存相关
* 磁盘缓存策略(Disk Cache Strategy)
* ALL:既缓存原始图片,也缓存转换过后的图片;
* AUTOMATIC (默认策略):它会尝试对本地和远程图片使用最佳的策略。当你加载远程数据(比如,从URL下载)时,AUTOMATIC 策略仅会存储未被你的加载过程修改过(比如,变换,裁剪–译者注)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。
* DATA:只缓存未被处理的文件。我的理解就是我们获得的 stream。它是不会被展示出来的,需要经过装载decode,对图片进行压缩和转换,等等操作,得到最终的图片才能被展示。
* NONE:表示不缓存任何内容。
*/
private void basicWithCache() {
//磁盘缓存策略
Glide.with(this)
.load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606658922596&di=f449f13a338c9fa2895f003b48b73c6e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F13%2F41%2F01300000201800122190411861466.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(mBinding.ivNine);
//仅从缓存加载图片
//如果图片在内存缓存或在磁盘缓存中,它会被展示出来。否则只要这个选项被设置为true,这次加载会视同失败。
Glide.with(this)
.load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606658922596&di=f449f13a338c9fa2895f003b48b73c6e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F13%2F41%2F01300000201800122190411861466.jpg")
.onlyRetrieveFromCache(true)
.into(mBinding.ivTen);
//跳过缓存
Glide.with(this)
.load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606658922596&di=f449f13a338c9fa2895f003b48b73c6e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F13%2F41%2F01300000201800122190411861466.jpg")
.skipMemoryCache(true) //跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) //跳过磁盘缓存
.into(mBinding.ivEleven);
}
获取Bitmap
在有些地方我们需要网络图片转为Bitmap格式,方便后续应用,这时可以用Glide实现转换,但是这个方法已经过时,使用上需要注意。
/**
* 获取Bitmap
*/
private void getBitmapWithGlide(){
Glide.with(this)
.asBitmap()
.load("网络图片地址")
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
mBinding.ivTwelve.setImageBitmap(resource);
}
});
}
缓存刷新
网络图片地址不变,更好图片,应用不写在卸载重新安装的情况下,图片没有刷新。此时我们可以定制缓存刷新策略来进行图片的更新 .signature()方法。