Glide开源库

来源:互联网 发布:java就业培训教程下载 编辑:程序博客网 时间:2024/05/14 08:42
github托管:https://github.com/bumptech/glide
官方文档:https://github.com/bumptech/glide/wiki

引用项目
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,开发者需要提供一个宽和高的像素值,用来加载你的资源文件,并且你需要去实现。
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 Integrationcompile '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 Integrationcompile '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


网上一个比较详细的系列文章, 写的不错,
原文:https://futurestud.io/blog/glide-getting-started
翻译:http://mrfu.me/2016/02/27/Glide_Getting_Started/

Demo下载
2 0
原创粉丝点击