Glide学习笔记

来自于 Glide - 开始!

1、依赖:

compile 'com.github.bumptech.glide:glide:3.6.0'

2、基本使用:

    Glide.with(context) //参数Activity/Fragment
                        //设置路径
                        .load(circleItem.getPics())
                        //缓存策略,缓存最终图片
                        .diskCacheStrategy(DiskCacheStrategy.RESULT)
                        //占位图
                        .error(R.drawable.ic_default_img).placeholder(R.drawable.ic_default_img)
                        //动画
                        .crossFade()
                        //调整图片像素大小
                        .override(320,  320)
                        //目标图片进行裁剪
                        .fitCenter().into(((ItemViewHolder) holder).img);

其中几个方法:

1、CenterCrop()和fitCenter()
分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER。

  • CenterCrop():会缩放图片让图片充满整个ImageView的边框,然后裁掉超出的部分。ImageVIew会被完全填充满,但是图片可能不能完全显示出。
  • fitCenter():会缩放图片让两边都相等或小于ImageView的所需求的边框。图片会被完整显示,可能不能完全填充整个ImageView。

2、硬盘缓存diskCacheStrategy():

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像(转换后的)
  • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

如果已经缓存过全尺寸图片,则根据全尺寸图片进行调整,不用重新下载了

3、override
如果没有为图片指定尺寸(override),默认会以View的大小去限制图片的大小

3、特点:

  • Glide支持远程图片/本地图片的获取、大小调整和展示
    参考:使用Glide加载图片系列之一从不同的数据源加载图片
  • 图片加载会和Activity/Fragment的生命周期保持一致,如paused状态暂停加载,resumed状态又自动重新加载
  • 支持GIF:Glide.with(context).load(““):GIF动画图片可以自动显示为动画效果
  • 加载静态图片:Glide.with(context).load(“图片路径“).asBitmap(),如果是gif,仅仅显示第一帧。
  • 加载gif:Glide.with(context).load(“图片路径“).asGif(),如果不是gif,会被当作error处理。
  • 如果相关的item已经滚出了屏幕的范围,Glide会自动取消超出屏幕的图片请求。Glide是通过在ImageView上设置一个tag,在加载另外一张图片之前检查这个tag,如果存在就取消第一次请求。
  • 内存缓存 更小的图片 : Glide 以 url、viewwidth、viewheight、屏幕的分辨率等做为联合 key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小

4、一些方法

1、关于downloadOnly、preload

  • downloadOnly方法
    downloadOnly不是用来重置图片大小的,即便设置了大小,也只会预缓存原始图像,不会缓存“结果”图像;参数通常为Target.SIZE_ORIGINAL,如下:
Glide.with(this).load(url)
        .downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL);
  • preload
    如果想要预缓存图片,可以使用preload,注意前后的transformation(fitCenter)和size必须一致
Glide.with(this).load(url)
        .diskCacheStrategy(DiskCacheStrategy.RESULT).fitCenter()
        .preload(260,260);

downloadOnly仅仅进行硬盘缓存(缓存SOURCE),preload进行硬盘和内存缓存

downloadOnly、preload

参考:Difference between downloadOnly() and preload()Is that downloadOnly not cache the image?

2、 Glide 中的回调:Targets
Glide 提供了各种的 targets ,可以在 Glide 做完网络请求和处理之后,在这里得到返回的结果。

  • SimpleTarget
    只是想通过Glide加载一个Bitmap而不是把它显示到View中
    private SimpleTarget<Bitmap> simpleTarget=new SimpleTarget<Bitmap>(200,200) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
        }
    };
  • ViewTarget:
    通过Glide加载图片到对应的View中, 默认不支持加载图片到非ImageView 中,但是可以通过继承 ViewTarget 和其子类实现。
    • ViewTarget<T,Z>
    • ImageViewTarget<Z>
      • BitmapImageViewTarget:使用asBitmap()进行加载的默认目标
      • DrawableImageViewTarget
      • GlideDrawableImageViewTarget:正常加载和使用asGif()进行加载的默认目标.

加载图片到RelativeLayout中

    private ViewTarget<RelativeLayout, GlideDrawable> viewTarget=new ViewTarget<RelativeLayout, GlideDrawable>(bgContainer) {
        @Override
        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
            this.view.setBackground(resource.getCurrent());
        }
    };
    Glide.with(getActivity()).load(R.drawable.ic_main_bg).diskCacheStrategy(DiskCacheStrategy.NONE)
            .into(viewTarget);

注意:
1、在into()方法中,不要使用匿名内部类:在 Glide 做完图片请求之前, Android 垃圾很可能会回收这个匿名内部类对象,最终这可能会导致,当图像加载完成了,但是回调再也不会被调用。
2、使用SimpleTarget<Bitmap>时,需要为target指定一个尺寸

参考: Glide之Target

3、用 GlideModule自定义 Glide

  • 实现GlideModule接口,全局改变 Glide 行为
public class ConfigurationGlide implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 设置别的get/set tag id,以免占用View默认的,Glide的3.6.0可以
        ViewTarget.setTagId(R.id.glide_tag_id);

        /*
        内存缓存
        Glide提供了一个类MemorySizeCalculator,用于决定内存缓存大小以及 bitmap 的缓存池。
        bitmap 池维护了你 App 的堆中的图像分配。
        正确的 bitmpa 池是非常必要的,因为它避免很多的图像重复回收,这样可以确保垃圾回收器的管理更加合理。
        它的默认计算实现
        */
        MemorySizeCalculator memorySizeCalculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = memorySizeCalculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = memorySizeCalculator.getBitmapPoolSize();
        builder.setMemoryCache(new LruResourceCache((int) (defaultMemoryCacheSize*1.2f)));
        builder.setBitmapPool(new LruBitmapPool((int) (defaultBitmapPoolSize * 1.2f)));

        /*
        磁盘缓存
        Glide图片缓存有两种情况,一种是内部磁盘缓存另一种是外部磁盘缓存。
        我们可以通过 builder.setDiskCache()设置,并且Glide已经封装好了两个类实现外部和内部磁盘缓存,
        分别是InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory
         */
        //磁盘缓存100M,默认250M
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,100*1024*1024));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

磁盘缓存可以位于应用的私有目录(除了它自己,没有别的应用可以访问),也可以位于外部存储,不能一起设置这两个

  • 声明:Glide 会扫描 AndroidManifest.xml 为 GlideModule 的 meta 声明。
<meta-data android:name="com.hqgj.shareimgtransition.common.ConfigurationGlide" android:value="GlideModule"/>

参考: android学习之路(一)--Glide学习

尽量不要使用太大的图片,一般页面上图片显示多大就把图片设置成多大,如果是后台上传的图片,可以使用组件把图片生成缩略图,如ASPJPEG上传组件。

4、为不同的分辨率设备,加载不同尺寸的图片

需要使用我们自己的ModeLoader(.using(new MyUrlLoader(this))),加载自己的数据源(.load(T model)),如下:

    Glide.with(this).using(new MutImgUrlLoader(this))
            .load(new MutImgDataModel() {
                @Override
                public String buildUrl(int width, int height) {
                    if(width>=1440){
                        return result.getImg()+ ThumbnailUtil.IMG1440;
                    }else if(width>=1080){
                        return result.getImg()+ThumbnailUtil.IMG1080;
                    }else if(width>=720){
                        return result.getImg()+ThumbnailUtil.IMG720;
                    }else if(width>=480){
                        return result.getImg()+ThumbnailUtil.IMG480;
                    }else {
                        return result.getImg()+ThumbnailUtil.IMG1080;
                    }
                }
            })
            .asBitmap()
            .transform(new GlideCircleTransform(this))
            .error(R.mipmap.ic_launcher)
            .animate(animator)
            .into(new BitmapImageViewTarget(imageView){
                @Override
                protected void setResource(Bitmap resource) {
                    super.setResource(resource);
                }
            });

实现自定义的ModelLoader,继承BaseGlideUrlLoader

public class MutImgUrlLoader extends BaseGlideUrlLoader<MutImgDataModel> {
    public MutImgUrlLoader(Context context) {
        super(context);
    }
    @Override
    protected String getUrl(MutImgDataModel model, int width, int height) {
        return model.buildUrl(width,height);
    }
}

自定义数据源:

public interface MutImgDataModel {
    public String buildUrl(int width, int height);
}

这样,我们在高分率的设备上加载大图的url1,在低分辨率的设备上加载小图url2。从而实现了根据不同手机上的像素值大小加载不同尺寸的图片的需求。

参考:使用Glide加载图片系列之一从不同的数据源加载图片

5、集成网络库
用 Glide 集成一个网络库,需要一个 Glide 的 ModeLoader 的接口。为了让你更加易用,Glide 为2个网络库提供了实现: OkHttp 和 Volley 。
Volley

dependencies {
  ...
  // Glide
  compile 'com.github.bumptech.glide:glide:3.6.1'
  // Glide's Volley Integration
  compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
  compile 'com.mcxiaoke.volley:library:1.0.8'
}

这将添加 Volley 并集成该库到你的项目中。集成库添加GlideModule 到你的 Android.Manifest 。Glide 会自动认出它,然后使用 Volley 作为网络库。并不要求做其他的配置!

参考:Glide - 集成网络栈

6、取消缓存
取消内存缓存(在主线程中调用)

Glide.get(this).clearMemory();

7、在listview中加载高度不固定图片,加载刷新图片跳动解决?
为啥高度不固定的时候会闪烁呢,应该跟图片高度不同有关,在更新listview时候,会去重新计算listview高度,绘制item,不同高度图片会重新计算.

8、-实现滚动加载,不滚动时不加载
Glide.with(context).resumeRequests()/Glide.with(context).pauseRequests()

参考:
Android图片库--Glide Wiki中文翻译图片加载框架Glide解析对比Picasso内存占用Yelp app是如何使用Glide优化图片加载的Glide的使用大法与内伤治疗方案

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

推荐阅读更多精彩内容