[转载]Glide

转载至:http://linanyang.com/2016/04/29/Glide/

介绍

Glide由bumptech团队开发,在2014年Google正式推出,广泛的用在Google的开源项目中,Glide与Picasso有着很高的相似度,细节上有不少的区别,Glide比Picasso加载速度快,也比Picasso需要更大的缓存空间。

导入库

dependencies 
{
     compile'com.github.bumptech.glide:glide:3.7.0'
 }

基本用法

Glide 用起来非常简单

Glide.with(context)  
     .load(http://img1.imgtn.bdimg.com/it/u=3519779342,2692245303&fm=15&gp=0.jpg")  
     .into(imageview); 

这就是加载一张图片的代码

常见设置

  • .placeholder() 占位图片
  • .error() 加载失败
  • .crossFade()淡入淡出
  • .dontAnimate()无动画效果
  • .override()调整图片大小
  • .transform()自定义图形转换
  • .skipMemoryCache(true)不做内存缓存
  • .diskCacheStrategy(DiskCacheStrategy.ALL)磁盘缓存
  • DiskCacheStrategy.ALL 缓存所有版本的图片
  • DiskCacheStrategy.NONE 不缓存任何图片
  • DiskCacheStrategy.SOURCE 只缓存全分辨率的图像
  • DiskCacheStrategy.RESULT 只缓存经过处理的图片

用法(Glide可以加载gif图片 但是会消耗太多内存 谨慎使用)

    Glide.with(mContext)
         .load(R.drawable.steven)
         .dontAnimate()
         .placeholder(R.mipmap.ic_launcher)
         .error(R.mipmap.ic_launcher)
         .diskCacheStrategy(DiskCacheStrategy.ALL)
         .transform(new BitmapRotateTransformation(mContext , 90f))  自定义将图片旋转90°
         .into(imageView);

高级用法

设置网络访问库

设置为什么网络请求库就导入什么集成包,比如okhttp需导入

  • compile 'com.github.bumptech.glide:okhttp-integration:1.4.0'

      //在Application设置Glide网络访问方式
      Glide.get(this).register(GlideUrl.class, InputStream.class,new OkHttpUrlLoader.Factory(单例一个okhttpclien对象);
      //register(Class<T> modelClass,Class<Y> resourceClass,ModelLoaderFactory<T, Y> factory)前两个参数为第三个参数的泛型
    

监听加载进度

在调用.into()方法的时候不直接设置target,而是

    Glide.with(mContext).load(urlString_net)
                        .dontAnimate()        
                        .skipMemoryCache(true)
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .error(R.mipmap.ic_launcher)
                        .into(new GlideDrawableImageViewTarget(imageView) { //加载失败
                            @Override
                            public void onLoadFailed(Exception e, Drawable errorDrawable) {
                                super.onLoadFailed(e, errorDrawable);
    
                            }
    
                            @Override
                            public void onLoadStarted(Drawable placeholder) {//加载开始
                                super.onLoadStarted(placeholder);
    
                            }
    
                            @Override
                            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {//加载完成
                                super.onResourceReady(resource, animation);
    
                            }
                        });

设置缓存大小及清除缓存

设置缓存大小

public class CustomGlideModule implements GlideModule {
       @Override
    public void applyOptions(Context context, GlideBuilder builder) {//应用选项

//        .setMemoryCache(MemoryCache memoryCache)   
//        .setBitmapPool(BitmapPool bitmapPool)         
//        .setDiskCache(DiskCache.Factory diskCacheFactory) 
//        .setDiskCacheService(ExecutorService service)    
//        .setResizeService(ExecutorService service)  
//        .setDecodeFormat(DecodeFormat decodeFormat) 

    builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

    int cacheSize = 10 << 20;
    builder.setDiskCache(
            new InternalCacheDiskCacheFactory(context, cacheSize) 内部缓存
            //new ExternalCacheDiskCacheFactory(context, cacheSize) 外部缓存
    );
}

@Override
public void registerComponents(Context context, Glide glide) {//注册组件
    // nothing to do here
    }
}

在AndroidManifest创建

<meta-data
       android:name="cn.lny.glide.CustomGlideModule"
       android:value="GlideModule" />

清除缓存

//清除内存缓存
Glide.get(mContext).clearMemory();
//清除磁盘缓存
new Thread(new Runnable() {
    @Override
    public void run() {
           Glide.get(mContext).clearDiskCache();
    }

注意:清除磁盘缓存必须在子线程

图形转换

旋转

public class BitmapRotateTransformation extends BitmapTransformation {

private float rotateRotationAngle = 0f;

public BitmapRotateTransformation(Context context, float rotateRotationAngle) {
    super(context);

    this.rotateRotationAngle = rotateRotationAngle;
    }

@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
    Matrix matrix = new Matrix();
    matrix.postRotate(rotateRotationAngle);
    Bitmap result = Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        result.setConfig(Bitmap.Config.ARGB_8888);
    }
    return result;
    }

@Override
public String getId() {
    return getClass().getName();
    }
}

切圆角

public class BitmapCircleTransformation extends BitmapTransformation {
public BitmapCircleTransformation(Context context) {
    super(context);
}

@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
    return circleCrop(pool , toTransform);
}


private Bitmap circleCrop(BitmapPool pool, Bitmap source) {
    if (source == null) return null;

    int size = Math.min(source.getWidth(), source.getHeight());
    int x = (source.getWidth() - size) / 2;
    int y = (source.getHeight() - size) / 2;

    //创建一个空白Bitmap,将在该Bitmap上铺设画布进行绘图
    Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_4444);
    if (result == null) {
        result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_4444);
    }

    Canvas canvas = new Canvas(result);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    //选择原图中的中心矩形,绘制在画布上
    Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
    paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
    float r = size / 2f;
    canvas.drawCircle(r, r, r, paint);
    return result;
    }

@Override
public String getId() {
    return getClass().getName();
    }
}

总结

Glide库在使用过程中内存占用低,扩展性强。无法设置加载图片的最大宽高,无法指定删除某一个图片的缓存(可以用加signature的方式试其失效并重新下载,但不可以删除)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • 学习来源:郭霖大师博客地址 1、图片加载框架挺多,如Volley、Glide、Picasso、Fresco、本次是...
    子谦宝宝阅读 1,759评论 0 6
  • 一、简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫Glide的图片加载库,作者是bumptech。这...
    天天大保建阅读 7,485评论 2 28
  • 7.1 压缩图片 一、基础知识 1、图片的格式 jpg:最常见的图片格式。色彩还原度比较好,可以支持适当压缩后保持...
    AndroidMaster阅读 2,519评论 0 13
  • 在一个 Gradle 项目中在你的 build.gradle中添加下面这行代码: 从一个 URL 中加载图片就像 ...
    A_Coder阅读 1,985评论 0 4
  • Glide 是一个 android 平台上的快速和高效的开源的多媒体资源管理库,提供 多媒体文件的压缩,内存和磁盘...
    帅气的欧巴阅读 2,774评论 1 18