Glide4.0使用

引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1. 导入
repositories {
mavenCentral()
}
dependencies {
compile 'com.github.bumptech.glide:glide:4.0.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'
compile 'com.android.support:support-v4:25.3.1'
}
2. 混淆
如果你有使用到 proguard,那么请把以下代码添加到你的 proguard.cfg 文件中:
-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 *;
}

入门

基本用法

加载

1
Glide.with(fragment).load(myUrl).into(imageView);

取消加载

已经和context的生命周期关联,一般不用调用此方法

1
Glide.with(fragment).clear(imageView);

RecyecleView

glide会自己判断网址为空的情况(为空清空内容或显示默认图),要注意imageView的复用

复用问题:对 View 调用 clear()into(View),表明在此之前的加载操作会被取消

1
2
3
4
5
6
7
8
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Glide.with(fragment).clear(holder.imageView);
String url = urls.get(position);
Glide.with(fragment)
.load(url)
.into(holder.imageView);
}

GlideApp

此类可生成出一个流式 API,内联了多种选项,和集成库中自定义的选项

目前仅可以在 Application 模块内使用(在app模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//内存
int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
//磁盘
int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
builder.setDiskCache(new DiskLruCacheFactory("cachePic", diskCacheSizeBytes));
}

定义扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@GlideExtension
public class MyAppExtension {
// Size of mini thumb in pixels.
private static final int MINI_THUMB_SIZE = 200;
private MyAppExtension() {
} // utility class
@GlideOption
public static void miniThumb(RequestOptions options) {
options.fitCenter()
.override(MINI_THUMB_SIZE);
}
}

占位图片

1
2
3
4
5
6
GlideApp.with(this)
.load(url)
.placeholder(new ColorDrawable(Color.BLACK))//占位
.error(new ColorDrawable(Color.RED))//失败
.fallback(new ColorDrawable(Color.GRAY))//地址为null
.into(iv);

剪裁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GlideApp.with(this)
.load(url)
.override(100,100)//指定像素大小
.thumbnail(0.1f)//缩略图
.circleCrop()//圆形
.centerInside()//缩放到两边都小于等于宽或高,不拉伸居中
.fitCenter()//缩放到两边都小于等于宽或高拉伸居中
.centerCrop()//缩放到两边都大于等于宽或高居中剪裁
.into(iv1);
//自定义option,配置剪裁
GlideOptions options = new GlideOptions();
options.circleCrop();
GlideApp.apply(options)
//glide自带的option
GlideApp.apply(RequestOptions.centerCropTransform())

动画

BitmapTransitionOptions DrawableTransitionOptions

1
2
GlideApp.transition(withCrossFade(1000))
.dontTransform()//关闭动画

监听

如果返回true,glide将不再操作.例如:失败不展示失败占位图

1
2
3
4
5
6
7
8
9
10
11
GlideApp.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
})

优先级

1
2
3
4
5
6
7
/*
IMMEDIATE 立即,不管优先级
HIGH
NORMAL
LOW
*/
GlideApp.priority(IMMEDIATE)

缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GlideApp.diskCacheStrategy(DiskCacheStrategy.ALL)//磁盘缓存模式
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.onlyRetrieveFromCache(true)//只使用缓存
.skipMemoryCache(true)//跳过内存
// This method must be called on the main thread.
Glide.get(this).clearDiskCache();
//不推荐
Glide.get(this).clearMemory();
//暂时允许Glide在应用的某些部分使用更多或更少的内
Glide.get(this).setMemoryCategory(MemoryCategory.LOW);
// Or:
Glide.get(this).setMemoryCategory(MemoryCategory.HIGH);
// This method must be called on the main thread.
Glide.get(this).clearDiskCache();
//不推荐
Glide.get(this).clearMemory();

加载类型

1
2
3
4
GlideApp.with(this).asFile();
GlideApp.with(this).asBitmap();
GlideApp.with(this).asDrawable();
GlideApp.with(this).asGif();

配合okhttp

1
2
3
4
<!--Manifest-->
<meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
android:value="GlideModule" />

标记

同一个url的问题

1
GlideApp.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

下载图片缓存图片

获取bitmap,可以对原图进行裁剪和大小指定操作(用于微信分享获取小图)

记得在子线程中执行 InterruptedException ExecutionException 阻塞线程

1
2
3
4
5
6
7
8
9
10
try {
Bitmap bitmap = GlideApp.with(this)
.asBitmap()
.load("url")
.centerCrop()
.submit(100, 100)//size
.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}

缓存图片获得文件对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FutureTarget<File> future = GlideApp.with(this)
.load("url")
.downloadOnly(100, 100);//size 已经废弃不推荐使用
try {
File file = future.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
try {
File file = GlideApp.with(this)
.asFile()
.load("url")
.centerCrop()
.submit(100, 100)
.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}

通知图库更新

1
2
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(currentFile.getPath()))));