Android Glide基础介绍

01.平时基础使用

  • 常用api如下所示
    • thumbnail(float sizeMultiplier)——请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,就显示缩略图,否则就不显示。系数sizeMultiplier必须在(0,1)之间,可以递归调用该方法。
    • sizeMultiplier(float sizeMultiplier)——在加载资源之前给Target大小设置系数。
    • diskCacheStrategy(DiskCacheStrategy strategy)——设置缓存策略。默认采用DiskCacheStrategy.RESULT策略,对于download only操作要使用DiskCacheStrategy.SOURCE。
      • DiskCacheStrategy.SOURCE:缓存原始数据,
      • DiskCacheStrategy.RESULT:缓存变换(如缩放、裁剪等)后的资源数据,
      • DiskCacheStrategy.NONE:什么都不缓存,
      • DiskCacheStrategy.ALL:缓存SOURC和RESULT。
    • priority(Priority priority)——指定加载的优先级,优先级越高越优先加载,但不保证所有图片都按序加载。枚举Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。默认为Priority.NORMAL。
    • dontAnimate()——移除所有的动画。
    • animate(int animationId)——在异步加载资源完成时会执行该动画。
    • animate(ViewPropertyAnimation.Animator animator)——在异步加载资源完成时会执行该动画。
    • placeholder(int resourceId)——设置资源加载过程中的占位Drawable。
    • placeholder(Drawable drawable)——设置资源加载过程中的占位Drawable。
    • fallback(int resourceId)——设置model为空时要显示的Drawable。如果没设置fallback,model为空时将显示error的Drawable,如果error的Drawable也没设置,就显示placeholder的Drawable。
    • fallback(Drawable drawable)——设置model为空时显示的Drawable。
    • error(int resourceId)——设置load失败时显示的Drawable。
    • error(Drawable drawable)——设置load失败时显示的Drawable。
    • listener(RequestListener)——设置加载监听事件,对请求状态进行监听

02.with()绑定生命周期

  • with()绑定生命周期
    • with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
    • with(Activity activity). 使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
    • with(FragmentActivity activity). Glide的请求会受到FragmentActivity生命周期控制。
    • with(android.app.Fragment fragment). Glide的请求会受到Fragment 生命周期控制。
    • with(android.support.v4.app.Fragment fragment). Glide的请求会受到Fragment生命周期控制。
  • 为何要绑定生命周期
    • with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中呢?也没关系,我们可以获取当前应用程序的ApplicationContext,传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

03.load()加载数据

  • Glide基本可以load任何可以拿到的媒体资源,load的参数也不局限于String类型。
  • 可以拿到的资源:
  • load()的参数类型:
    • load(Uri uri),
    • load(File file),
    • load(Integer resourceId),
    • load(URL url),
    • load(byte[] model),
    • load(T model),
    • loadFromMediaStore(Uri uri)

04.缓存机制使用

  • 缓存机制的作用
    • 内存缓存的主要作用是防止应用重复将图片数据读取到内存当中
    • 硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据
  • 内存缓存
    • 默认情况下,Glide自动就是开启内存缓存的。也就是说,当我们使用Glide加载了一张图片之后,这张图片就会被缓存到内存当中,只要在它还没从内存中被清除之前,下次使用Glide再加载这张图片都会直接从内存当中读取,而不用重新从网络或硬盘上读取了,这样无疑就可以大幅度提升图片的加载效率。比方说你在一个RecyclerView当中反复上下滑动,RecyclerView中只要是Glide加载过的图片都可以直接从内存当中迅速读取并展示出来,从而大大提升了用户体验。
    • api设置是否内存缓存:.skipMemoryCache(true)。这里设置true,就表示禁用掉Glide的内存缓存功能。
  • 磁盘缓存
    • 调用diskCacheStrategy()方法并传入DiskCacheStrategy.NONE,就可以禁用掉Glide的硬盘缓存功能了。
    • 这个diskCacheStrategy()方法基本上就是Glide硬盘缓存功能的一切,它可以接收五种参数:
      • DiskCacheStrategy.NONE: 表示不缓存任何内容。
      • DiskCacheStrategy.DATA: 表示只缓存原始图片。
      • DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
      • DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
      • DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。

05.设置加载动画

  • 通常的用法如下,使用api提供的几个常用动画:

    1
    2
    3
    4
    5
    Glide.with(this)
    .load(url)
    //transition(TransitionOptions transitionOptions)
    .transition(DrawableTransitionOptions.withCrossFade())
    .into(imageView);
    • TransitionOptions决定图片加载完成如何从占位符图片(或者之前的图片)过渡。
  • 有三种TransitionOptions:

    • GenericTransitionOptions 通用型
    • DrawableTransitionOptions
    • BitmapTransitionOptions
    • TransitionOptions是和你要加载的资源的类型绑定的,也就是说,如果你请求一张位图Bitmap,你就需要使用BitmapTransitionOptions,而不是DrawableTransitionOptions。如果既不是Bitmap也不是Drawable就使用GenericTransitionOptions。Glide加载网络图片默认的类型是Drawable,所以加载网络图片我们使用DrawableTransitionOptions即可。
  • 如果要使用自定义的动画,可以使用GenericTransitionOptions.with(int viewAnimationId)或者BitmapTransitionOptions.withCrossFade(int animationId, int duration)或者DrawableTransitionOptions.withCrossFade(int animationId, int duration)。
    出于性能考虑,最好不要在ListView,GridView,RecycleView中使用过渡动画,使用TransitionOptions.dontTransition()可以不加载动画,也可以使用dontAnimate不加载动画。

    1
    2
    RequestOptions options = new RequestOptions()
    .dontTransform();

06.指定图片加载格式

  • 使用Glide加载GIF图并不需要编写什么额外的代码,Glide内部会自动判断图片格式。我们将刚才那段加载图片代码中的URL地址替换成下面的GIF图片的URL地址就可以了。也就是说,不管我们传入的是一张普通图片,还是一张GIF图片,Glide都会自动进行判断,并且可以正确地把它解析并展示出来。

  • 但是如果我想指定图片的格式该怎么办呢?就比如说,我希望加载的这张图必须是一张静态图片,我不需要Glide自动帮我判断它到底是静图还是GIF图。想实现这个功能仍然非常简单,我们只需要再串接一个新的方法就可以了,代码如下所示:

    1
    2
    3
    4
    5
    Glide.with(this)
    .asBitmap()
    .load(url)
    .apply(options)
    .into(imageView);
  • 可以看到,这里在with()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。如果你传入的还是一张GIF图的话,Glide会展示这张GIF图的第一帧,而不会去播放它。这里注意asBitmap()方法必须跟在with()方法的后面,load()方法的前面,如果你写错了顺序就肯定会报错了。

  • 那么类似地,既然我们能强制指定加载静态图片,就也能强制指定加载动态图片,对应的方法是asGif(),代码中只需用asGif()方法去替代asBitmap()方法就好了。如果指定了只能加载动态图片,而传入的图片却是一张静图的话,那么结果自然就只有加载失败,如果指定了异常占位图的话异常占位图会展示出来。

  • Glide 4中新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载,用法都比较简单,就不再进行演示了。