github托管:https://github.com/bumptech/glide
引用项目
compile 'com.github.bumptech.glide:glide:3.7.0'
基本用法
1、加载图片
加载网络地址url值为
"http://img15.3lian.com/2015/f2/50/d/71.jpg"的图片,
Glide.with(this)
.load(url)
.into(image);
加载应用中的资源图片,
Glide.with(this)
.load(R.drawable.big_imag)
.into(image);
当然,可加载的资源类型不仅仅这两个,Glide的load方法提供了多种类型,根据实际情况使用,具体如下图,
2、加载过程显示和错误显示图片
由于网络、图片资源大小等原因,可能导致加载时间较长,为了提高用户体验,可以在等待过程中显示一个默认图片,Glide提供了placeholde方法实现该功能,
Glide.with(this)
.load(url)
.placeholder(R.drawable.default_pic)
.into(image);
当然,也有可能加载失败,可以显示加载失败后的图片,Glide提供了
error方法实现该功能,
Glide.with(this)
.load(url)
.error(R.drawable.error_pic)
.into(image);
3、缓存策略
DiskCacheStrategy.NONE
什么都不缓存 DiskCacheStrategy.SOURCE
仅仅只缓存原来的全分辨率的图像 DiskCacheStrategy.RESULT
仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的) DiskCacheStrategy.ALL
缓存所有版本的图像
Glide提供了四种缓存策略,NONE就不说了,SOURCE仅缓存原图片,第一次加载会下载然后缓存,下次用到该资源的时候直接读取缓存文件;RESULT缓存最终使用的图像,也就是说可能缓存多次,比如有两个Image控件,一个100*100,另一个200*200,虽然获取的是同一个网络资源,但缓存时会根据各自的大小进行缓存,即下载两次,缓存两次,那么如何避免多次下载呢?ALL策略可以解决这个问题,该策略在第一次加载时会将原图片缓存,大小不同的控件加载时先从缓存中读取原文件,然后根据自身大小进行缓存,下次使用时就不用先读取原文件了,其实就是空间换时间。
Glide默认使用RESULT,可以根据自身需求设置缓存策略。
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(image);
4、图片缩放
centerCrop,填充ImageView设置的大小,图片可能被拉伸填充。
Glide.with(this)
.load(url)
.centerCrop()
.into(image);
fitCenter,缩放图像让图等于或小于ImageView的边界范围,图像将会完全显示,但可能不会填满整个ImageView。
Glide.with(this)
.load(url)
.fitCenter()
.into(image);
5、显示gif和视频
除了可以显示静态的图片外,还可以显示gif、本地视频,
Glide.with(this)
.load(R.drawable.mygif)
.asGif()
.placeholder(R.drawable.default_pic)
.into(image);
String path = "sdcard/congo.mp4";
Glide.with(this)
.load(Uri.fromFile(new File(path)))
.placeholder(R.drawable.default_pic)
.into(image);
6、清除缓存
clearDiskCache--清除硬盘缓存
clearMemory--清除内存缓存需要注意的是,clearDiskCache不能再UI线程中执行。
全局配置
1、实现GlideModel接口自定义全局配置
public class GlideConfiguration implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
混淆配置
-keepnames class com.demo.glidedemo.GlideConfiguration
# or more generally:
#-keep public class * implements com.bumptech.glide.module.GlideModule
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
注册
<meta-data
android:name="com.demo.glidedemo.GlideConfiguration"
android:value="GlideModule" />
2、图片格式
Glide的默认Bitmap格式为RGB_565,占用内存为小一些,但是会损失图片质量,如果对这种格式的显示效果不满意,可以配置成ARGB_8888,
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
3、硬盘缓存
Glide中用setDiskCache方法设置硬盘缓存的路径和大小,默认使用InternalCacheDiskCacheFactory类来创建硬盘缓存,缓存文件放在应用自身缓存目录下,其他应用无法读取,默认缓存最大值为250M。当然也可以自己定义内部缓存目录和缓存大小,如,
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "glide", cacheSize));
ExternalCacheDiskCacheFactory可用来创建应用外部缓存目录和大小,
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "glide", cacheSize));
使用上面两个类配置硬盘缓存,基本路径是固定的,如果想要完全自己定以缓存目录,可以使用
DiskLruCacheFactory
来构建,有多个构造方法,
builder.setDiskCache(new DiskLruCacheFactory(cacheDir, cacheSize));
builder.setDiskCache(new DiskLruCacheFactory(cacheDir, "glide", cacheSize));
builder.setDiskCache(new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() {
@Override public File getCacheDirectory() {
return new File(cacheDir);
}
}, cacheSize));
如果想完全控制缓存的构建,可以实现
DiskCache.
Factory
接口,
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
File cacheLocation = new File(cacheDir);
cacheLocation.mkdirs();
return DiskLruCacheWrapper.get(cacheLocation, cacheSize);
}
});
4、内存缓存
GlideBuilder当中,允许开发者去设置内存当中图片缓存区的大小,通过实现Glide的MemoryCache和BitmapPool。
默认大小由
MemorySizeCalculator类来计算出合适的缓存大小,
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
如果在应用当中想要调整内存缓存的大小,开发者可以通过如下方式:
Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);
Glide内存缓存的目的是减少I/O,提高效率 ,可以通过GlideBuidler的
setMemoryCache(MemoryCache memoryCache)
去设置缓存的大小,开发者可以通过LruResourceCache去设置缓存区的大小,
new GlideBuilder(context).setMemoryCache(new LruResourceCache(yourSizeInBytes));
可以通过GlideBuilder的setBitmapPool()方法设置池子的大小,LruBitmapPool是Glide的默认实现,使用如下:
new GlideBuilder(context).setBitmapPool(new LruBitmapPool(sizeInBytes));
一般内存缓存用默认的就可以,尽量不要自己去定义。
自定义Target
1、SimpleTarget
如果简单地加载一个Bitmap,可以通过以下简单的方式而不是直接地显示给用户,可能是显示一个notification,或者上传一个头像,Glide都能很好地实现。
SimpleTarget提供了对Target的简单实现,并且让你专注于对加载结果的处理 。使用SimpleTarget,开发者需要提供一个宽和高的像素值,用来加载你的资源文件,并且你需要去实现。
SimpleTarget提供了对Target的简单实现,并且让你专注于对加载结果的处理 。使用SimpleTarget,开发者需要提供一个宽和高的像素值,用来加载你的资源文件,并且你需要去实现。
private void showSimpleTarget() {
SimpleTarget simpleTarget = new SimpleTarget<Bitmap>(250, 250) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
image.setImageBitmap(resource);
}
};
Glide.with(this)
.load(url)
.asBitmap()
.into(simpleTarget);
}
2、ViewTarget
我们不能直接使用ImageView的原因可能是多种多样的,刚才展示如何去接收一个 Bitmap,现在我们要更进一步。假设你有一个自定义View,Glide并不支持加载图片到自定义view中,Glide可以用ViewTarget来实现,
private void showViewTarget() {
ViewTarget<MyView, GlideDrawable> viewTarget = new ViewTarget<MyView, GlideDrawable>(myview) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.setImage(resource.getCurrent());
}
};
Glide.with(this)
.load(url)
.into(viewTarget);
}
集成网络栈
Volley
1、添加依赖
// Glide's Volley Integration
compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
compile 'com.mcxiaoke.volley:library:1.0.8'
2、混淆
-keep class com.bumptech.glide.integration.volley.VolleyGlideModule
#or
-keep public class * implements com.bumptech.glide.module.GlideModule
OkHttp3
1、添加依赖
// Glide's OkHttp Integration
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
2、混淆
-keep class com.bumptech.glide.integration.okhttp3.OkHttpGlideModule
网上一个比较详细的系列文章, 写的不错,