一、前言
Glide分为V3.版本和V4.版本,在V3.版本中,选项由一系列复杂的异构建造者(multityped builders)单独处理。比如BitmapRequestBuilder、DrawableRequestBuilder、GifRequestBuilder等。但是在Gilde V4中,由一个单一类型的唯一一个建造者接管一系列选项对象,即RequesetBuilder。本博客主要介绍Glide V4*版本的使用规则和技巧。
二、配置和简单的使用
2.1 配置
在app目录下的build.gradle中添加依赖
compile 'com.github.bumptech.glide:glide:4.3.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.3.0'
compile 'com.android.support:support-v4:26.1.0' //glide需要support库的支持
如果使用了proguard混淆,需要添加混淆规则:
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
权限声明
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.2 基本使用
将图片资源加载进ImageView控件中去
Glide.with(context) //with()方法可以接收Context、Activity或者Fragment类型参数
.load(myUrl) //load方法中不仅可以传入图片的url地址,还可以传入图片文件File,resource,图片的byte数组等
.into(imageView);
三、高级使用
3.1 RequestOptions
通过RequestOptions类和apply()方法完成Glide选项的设置,可以通过RequestOptions设置的选项大致可以包括如下:
1.占位符(placeholders)
请求过程中显示,请求完成后再被替换成为请求到的资源。如果请求的资源是内存中的,placeholder可能就不会被显示。如果请求失败且error Drawable没有设置,placeholder将继续被显示。如果请求的url/model为空且error Drawable和fallback Drawable都没设置,placeholder将继续被显示。
2.error
请求失败时显示error Drawable,当请求的url/model为空且fallback Drawable没设置时显示error Drawable
3.fallback
当请求的url/model为空时显示fallback Drawable。fallback Drawable主要目的是允许用户表明“空”是否被允许,因为Glide默认把空的url/model当做error处理。一个典型的场景就是未设置头像用户的avatar字段可能是null,而显示的时候我们需要显示一个默认的用户头像,此时设置fallback是个很好地选择。
4.skipMemoryCache
是否禁用内存缓存功能
5.diskCacheStrategy
缓存策略设置,DiskCacheStrategy.NONE表示不缓存任何内容;DiskCacheStrategy.DATA表示只缓存原始图片;DiskCacheStrategy.RESOURCE表示只缓存转换过后的图片;DiskCacheStrategy.ALL表示即缓存原始图片,也缓存转换过后的图片;DiskCacheStrategy.AUTOMATIC表示让Glide根据图片资源智能选择使用一种缓存策略。
6.transform
将图像变换,比如将图片裁剪成圆形图片,圆角图片,变换成高斯模糊或黑白等。在V4中提供的Transformation有圆角和圆形图片,如果需要实现其它变换,还需要实现自定义的Transformation。
3.2 Transition(动画)和TransitionOptions
TransitionOptions决定图片加载完成之后如何从占位符图片(或者之前的图片)过渡。过渡效果有淡入、交叉淡入和不过渡,参考如下:
Glide.with(fragment)
.load(url)
.transition(DrawableTransitionOptions.withCrossFade())
.into(view);
注意
TransitionOptions是和想要加载的资源类型绑定的,也就是说,如果请求一张位图(Bitmap),就需要使用BitmapTransition,而不是DrawableTransitionOptions。因此,请求的这张位图,需要使用简单的淡入,而不能用交叉淡入(DrawableTransitionOptions.withCrossFade)。如果既不是Bitmap也不是Drawable可以使用GenericTransitions。
3.3 RequestBuilder
每次调用Glide.with()都会得到一个RequestBuilder,而RequestBuilder就是Glide请求的主干,负责将options和请求的url/model结合起来并开始新的加载。
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment);
RequestBuilder的作用有:
1.指定加载类型。asBitmap()、asGif()、asDrawable()、asFile()。
2.指定要加载的url/model。
3.指定要加载到那个view。
4.指定要应用的RequestOption
5.指定要应用的TransitionOption
6.指定要加载的缩略图
RequestBuilder应用RequestOptions和transitionOptions
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment);
requestBuilder.apply(requestOptions);
requestBuilder.transition(transitionOptions);
RequestBuilder也可重复使用:
RequestBuilder<Drawable> requestBuilder =
Glide.with(fragment)
.asDrawable()
.apply(requestOptions);
for (int i = 0; i < numViews; i++) {
ImageView view = viewGroup.getChildAt(i);
String url = urls.get(i);
requestBuilder.load(url).into(view);
}
3.4 Transformation
Glide的图形变换,当使用Glide为ImageView加载图片时,Glide会根据ImageView的ScaleType自动应用相应的变换,如果scale type是CENTER_CROP,Glide将自动应用CentreCrop transformation, 如果scale type是FIT_CENTER或CENTER_INSIDE,glide将自动应用FitCenter transformation。Glide内置的transformation包括如下:
1.CenterCrop缩放宽和高都达到View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能超过边界。
2.CenterInside如果宽和高都在View的边界内,那就不缩放,否则缩放宽和高都进入View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能在边界内。
3.CircleCrop圆形且结合了CenterCrop的特性
4.FitCenter缩放宽和高都进入View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能在边界内。
5.RoundedCorners圆角。
Transformations的应用场景:
1.应用RequestOptions
RequestOptions requestOptions = new RequestOptions()
.fitCenter();
Glide.with(fragment)
.load(url)
.apply(requestOptions)
.into(imageView);
2.使用RequestOptions中的transform方法
import static com.bumptech.glide.request.RequestOptions.fitCenterTransform;
Glide.with(fragment)
.load(url)
.apply(fitCenterTransform())
.into(imageView);
3.V4特性,使用GlideApp,GlideApp需要配置生成。
GlideApp.with(fragment)
.load(url)
.fitCenter()
.into(imageView);
GlideApp.with(fragment)
.load(url)
.transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
.into(imageView);
GlideApp.with(fragment)
.load(url)
.transforms(new FitCenter(), new YourCustomTransformation())
.into(imageView);
4.多个变换
Glide.with(fragment)
.load(url)
.transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
.into(imageView);
3.5 配置内存缓存
Glide会自动分配内存和缓存,但是也可以选择在代码中自定义分配。
通过MemeorySizeCalculater设置
//方法一
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
.setMemoryCacheScreens(2) //缓存多少屏图像,默认是2
.build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
}
}
//方法二
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
}
}
//方法三
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setMemoryCache(new CustomGlideMemoryCache());
}
}
在主线程中清理内存缓存
GlideApp.get(context).clearMemory();
3.6 配置磁盘缓存
Glide使用DiskLurCacheWrapper作为默认的磁盘缓存,默认大小是250M,缓存文件放在APP的缓存文件夹下。
//在用法上可以指定内部存储或外部存储,也可以指定缓存文件大小和文件夹
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
// builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));
// builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
}
}
自定义磁盘缓存
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
return new YourAppCustomDiskCache();
}
});
}
}
清理磁盘缓存,在子线程中调用
GlideApp.get(context).clearDiskCache();
加载图片时设置磁盘缓存策略
GlideApp.with(getActivity())
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL) //默认的策略是DiskCacheStrategy.AUTOMATIC
.dontAnimate()
.centerCrop()
.into(imageView);
转载参考
官方文档
Glide v4详解
Glide最新版V4使用指南
Google推荐——Glide使用详解
GLide加载图片还能这样干——基于Glide4.0完美封装