美文网首页Android
Glide学习笔记

Glide学习笔记

作者: i冰点 | 来源:发表于2017-01-16 16:15 被阅读2406次

来自于 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的使用大法与内伤治疗方案

相关文章

  • 2020-03-26 Glide学习笔记

    Glide 三级缓存学习笔记 学习Glide 框架有一段时间,很多时候都是以懵逼的状态放弃源码阅读,然后有...

  • Glide 学习笔记

    入行一年半的android程序员,半个月前的一个上午还在跟同事讨论发不发年终奖,下午就被裁了。找工作快两个礼拜了,...

  • Glide学习笔记

    来自于 Glide - 开始! 1、依赖: 2、基本使用: 其中几个方法: 1、CenterCrop()和fitC...

  • Glide学习笔记

    默认情况下,Glide会在开始一个新的图片请求(网络请求)之前检查以下多级缓存 在调用Glide.with(act...

  • Glide 4.0学习笔记

    Glide 4.0使用 Glide v4 使用 注解处理器 (Annotation Processor) 来生成出...

  • Glide源码学习笔记

    本文是基于郭霖glide源码解析系列的学习笔记,在此记录一下。 一、fragment巧用: 使用没有界面的frag...

  • Glide 源码学习补漏,Glide 图片缓存原理探究

    基于 Gilde 4.3.1 上一篇Glide 源码学习,了解 Glide 图片加载原理中分析了 Glide 加载...

  • Android - 图片处理之Glide加载进度

    前言 带有加载进度的Glide,看着是不是很好,这里也是给自己做个笔记, 一:原理 Glide 默认肯定是没有这个...

  • Glide笔记

    Glide笔记 一、简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫Glide的图片加载库,作者是bu...

  • 详谈高大上的图片加载框架Glide -源码篇

    在上篇Glide文章中,我们介绍了Glide图片加载框架的使用,通过之前的学习,我们可能已经能熟练的将Glide图...

网友评论

    本文标题:Glide学习笔记

    本文链接:https://www.haomeiwen.com/subject/garfbttx.html