Glide 4.x集成及使用注意事项
前言
原文请到lmz14大神参考使用
更多用法请到官方指南参考使用
一、集成
1、project gradle
repositories {
mavenLocal()
}
2、app gradle
compile 'com.android.support:support-v4:25.3.1'
compile 'com.github.bumptech.glide:glide:4.0.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'
3、混淆
#glide4.0
-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 *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
# 从glide4.0开始,GifDrawable没有提供getDecoder()方法,
# 需要通过反射获取gifDecoder字段值,所以需要保持GifFrameLoader和GifState类不被混淆
-keep class com.bumptech.glide.load.resource.gif.GifDrawable$GifState{*;}
-keep class com.bumptech.glide.load.resource.gif.GifFrameLoader {*;}
4、在4.0中不用像3.X需要在AndroidManifest.xml配置GlideModule,而是通过注解继承AppGlideModule的子类来配置。
@GlideModule
public class GlideConfiguration extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//自定义缓存目录,磁盘缓存给150M 另外一种设置缓存方式
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "GlideImgCache", 150 * 1024 * 1024));
//配置图片缓存格式 默认格式为8888
builder.setDefaultRequestOptions(RequestOptions.formatOf(DecodeFormat.PREFER_ARGB_8888));
ViewTarget.setTagId(R.id.glide_tag_id);
}
/**
* 禁止解析Manifest文件
* 主要针对V3升级到v4的用户,可以提升初始化速度,避免一些潜在错误
* @return
*/
@Override
public boolean isManifestParsingEnabled() {
return false;
}
}
二、使用
1、基本用法
多数情况下,使用Glide加载图片非常简单,一行代码足矣:
Glide.with(context)
.load(myUrl)
.into(imageView);
取消加载同样很简单:
Glide.with(context).clear(imageView);
尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 Glide.with() 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。
2、加载圆形图
Glide.with(this)
.load(R.mipmap.ic_splash_bg)
.apply(bitmapTransform(new CropCircleTransformation()))
.into(mImageHead);
3、模糊过滤
Glide.with(this)
.load(R.mipmap.ic_splash_bg)
.apply(bitmapTransform(new BlurTransformation( 25, 4)))
.into(mImageView);
4、在 Application 模块中的使用
在 Application 模块中,可创建一个添加有 @GlideModule 注解,继承自 AppGlideModule 的类。此类可生成出一个流式 API,内联了多种选项,和集成库中自定义的选项:
package com.example.myapp;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
生成的 API 默认名为 GlideApp ,与 AppGlideModule 的子类包名相同。在 Application 模块中将 Glide.with() 替换为 GlideApp.with(),即可使用该 API 去完成加载工作。
GlideApp.with(context)
.load(myUrl)
.placeholder(placeholder)
.fitCenter()
.into(imageView);
三、注意事项
1、使用GlideApp代替Glide,asBitmap、asGif、asDrawable、asFile都要放到load之前(glide3.7.0都是要在load之后调用)。
public static void loadImg(Context context,String url, ImageView imageView){
GlideApp.with(context)
.asBitmap()
.load(url)
.placeholder(R.drawable.placeholder) //设置资源加载过程中的占位符
.into(imageView);
}
2、占位符.placeholder(R.drawable.placeholder)不能用.9图,占位图片和加载的目标图片会同时显示,只是目标图片会先显示缩略图,然后显示正常。
3、加载gif图时,若调用dontAnimate()移除所有动画,gif就会加载失败。
4、设置淡入淡出动画
glide3.7.0
Glide.with(context)
.load(url)
.crossFade(100) //系统渐变动画
.placeholder(R.drawable.placeholder)
.fallback(R.drawable.fallback)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
glide4.0
GlideApp.with(context)
.load(url)
.transition(DrawableTransitionOptions.withCrossFade(100))//淡入淡出100m
.placeholder(R.drawable.placeholder)
.fallback(R.drawable.fallback)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
5、磁盘缓存策略
glide3.7.0
DiskCacheStrategy 的枚举意义:
DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 只缓存全尺寸图
DiskCacheStrategy.RESULT 只缓存最终的加载图
DiskCacheStrategy.ALL 缓存所有版本图(默认行为)
glide4.0
//DiskCacheStrategy.ALL 既缓存原始图片,也缓存转换过后的图片。
// DiskCacheStrategy.NONE 不缓存任何内容
// DiskCacheStrategy.DATA 在资源解码前就将原始数据写入磁盘缓存(即只缓存原始图片)
// DiskCacheStrategy.RESOURCE 在资源解码后将数据写入磁盘缓存,即经过缩放等转换后的图片资源(即只缓存转换过后的图片)。
// DiskCacheStrategy.AUTOMATIC 让Glide根据图片资源智能地选择使用哪一种缓存策略。
//(默认采用)DiskCacheStrategy.AUTOMATIC策略
/-------------------------------------------------------------------------------/
//源码 RequestOptions.java
private DiskCacheStrategy diskCacheStrategy = DiskCacheStrategy.AUTOMATIC;
6、占位符、错误图片设置
glide4.0 若into中设置的是target,占位符(placeholder、error)需要在回调中再次设置,否则无效。
public static void loadImg(String url, ImageView imageView) {
//into中用Target,占位符(placeholder、error)需要在回调中设置
GlideApp.with(FanhuanApplication.getInstance().getApplication())
.asBitmap()
.load(url)
.placeholder(drawbleId) //设置资源加载过程中的占位符
.fallback(drawbleId)
.error(drawbleId)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
if(errorDrawable!=null){
imageView.setImageDrawable(errorDrawable);
}
}
@Override
public void onLoadStarted(@Nullable Drawable placeholder) {
super.onLoadStarted(placeholder);
if(placeholder!=null){
imageView.setImageDrawable(placeholder);
}
}
});
}