Glide图片缓存

Glide工程依赖

dependencies {  
    compile 'com.github.bumptech.glide:glide:3.5.2'  
    compile 'com.android.support:support-v4:22.0.0'  
} 

Glide使用需要Support Library v4依赖支持

Glide基本使用

Glide图片缓存_第1张图片
image

Glide.with()不仅可以接受Context,还可以接受Activity和Fragment,Glide会从Activity和Fragment中获取Context,在使用时,尽可能的将Activity或Fragment传递给Glide(好处:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载)

Glide.with(context)  
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg); 

默认Bitmap格式是RGB_565

Clide默认使用Bitmap格式是RGB_565加载图片,比ARGB_8888格式的内存开销要小一半,但同时会带来图片显示质量下降,可以通过创建一个新的GlideModule将Bitmap格式转换到ARGB_8888,提升图片质量

  • 自定义GlideModule

      public class GlideConfiguration implements GlideModule {  
    
          @Override  
          public void applyOptions(Context context, GlideBuilder builder) {  
              // Apply options to the builder here.  
              builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);  
          }  
    
          @Override  
          public void registerComponents(Context context, Glide glide) {  
              // register ModelLoaders here.  
           }  
      }
    
  • 在AndroidManifest.xml中将GlideModule定义为meta-data

      
    

磁盘缓存

Glide会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。具体说来就是:假如在第一个页面有一个200x200的ImageView,在第二个页面有一个100x100的ImageView,这两个ImageView本来是要显示同一张图片,却需要下载两次;可以通过改变Glide的行为让它即加载全尺寸图片,也加载不同尺寸图片

Glide.with(this)  
 .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")  
 .diskCacheStrategy(DiskCacheStrategy.ALL)  
 .into(ivImgGlide);  

下次在任何ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。

Clide常用属性

  • 占位符使用

    如果要使用Gilde显示一张网络上的图片,当网络不好的时候加载图片可能需要很长的时间,一个空的ImageViewzai 在任何UI上都不好看,这就有了占位符,在图片加载完成以前显示占位符。

    Glide 的流式接口让这个变得非常容易的去做到!只需要调用 .placeHolder() 用一个 drawable(resource) 引用,Glide 将会显示它作为一个占位符,直到你的实际图片准备好。

      Glide
      .with(context)
      .load(UsageExampleListViewAdapter.eatFoodyImages[0])
      .placeholder(R.mipmap.ic_launcher) // can also be a drawable
      .into(imageViewPlaceholder);
    
  • load():Glide接受所有的值(可以是本地的资源也可以是网络上的资源)

  • 错误占位符

    可以从字面的意思来理解什么是错误的占位符,也就是我们的APP从一个网站去加载一张图片的时候,返回时告诉我们获取失败,这时就用到了错误占位符来显示图片,如果想进行一些其他操作,可自己决定。

    调用 Glide 的流式接口和之前显示预加载占位符的例子是相同的,不同的是调用了名为 error() 的函数。

      Glide
      .with(context)
      .load("http://futurestud.io/non_existing_image.png")
      .placeholder(R.mipmap.ic_launcher) //添加占位图片
      .error(R.mipmap.future_studio_launcher) //添加获取网络图片失败占位图片
      .into(imageViewError);
    
  • crossFade()通过该方法Glide会默认提供一个平滑(渐入渐出)动画用于加载图片,crossFade() 方法还有另外重载方法.crossFade(intduration)。如果你想要去减慢(或加快)动画,随时可以传一个毫秒的时间给这个方法。动画默认的持续时间是 300毫秒。

  • dontAnimate():显示图片而没有任何淡入淡出效果,在Glide的建造者中调用.dontAnimate()

  • override(horizontalSize, verticalSize):用override(horizontalSize, verticalSize)调整图片大小

  • 图像缩放

    现在,对于任何图像操作,调整大小真的能让长宽比失真并且丑化图像显示。在你大多数的使用场景中,你想要避免发生这种情况。Glide 提供了一般变化去处理图像显示。提供了两个标准选项:centerCrop 和 fitCenter

    CenterCrop:CenterCrop()是一个裁剪技术,即缩放图像让它填充到 ImageView 界限内并且侧键额外的部分。ImageView 可能会完全填充,但图像可能不会完整显示.

       Glide
      .with(context)
      .load(UsageExampleListViewAdapter.eatFoodyImages[0])
      .override(600, 200) //调整图片大小
      .centerCrop() //图片缩放
      .into(imageViewResizeCenterCrop);
    

    FitCenter:fitCenter() 是裁剪技术,即缩放图像让图像都测量出来等于或小于ImageView的边界范围。该图像将会完全显示,但可能不会填满整个ImageView。

      Glide
      .with(context)
      .load(UsageExampleListViewAdapter.eatFoodyImages[0])
      .override(600, 200) //调整图片大小
      .fitCenter()  //图片缩放
      .into(imageViewResizeFitCenter);
    

    总结:平时在使用的时候还是CenterCrop()的时候多一些,就像ImageView里面也会用到android: scaleType="centerCrop"

  • 内存缓存

    调用了.skipMemoryCache(true) 去明确告诉 Glide 跳过内存缓存,这意味着 Glide 将不会把这张图片放到内存缓存中去,这里需要明白的是,这只是会影响内存缓,Glide将会仍然利用磁盘缓存来避免重复的网络请求。

      Glide 
      .with( context ) 
      .load( eatFoodyImages[0] ) 
      .skipMemoryCache( true ) //设置禁止Glide将图片写到内存缓存中
      .into( imageViewInternet );
    
  • 跳过磁盘缓存

    用.diskCacheStrategy()方法为Glide改变磁盘缓存的行为,不同的于.skipMemoryCache() 方法,它需要一个枚举而不是一个简答的布尔值,如果你想要为一个请求禁用磁盘缓存,使用枚举 DiskCacheStrategy.NONE

      Glide  
      .with( context )
      .load( eatFoodyImages[0] )
      .diskCacheStrategy( DiskCacheStrategy.NONE )//禁止磁盘缓存
      .skipMemoryCache(true) //禁止内存缓存
      .into( imageViewInternet );
    
  • 图片请求的优先级

    通常,你会遇到这样的使用场景:你的App将会需要在同一时间内加载多个图像。让我们假设你正在构建一个信息屏幕,这里有一张很大的英雄图片在顶部,还有两个小的,在底部还有一些不那么重要的图片。对于最好的用户体验来说,应用图片元素是显示要被加载和显示的,然后才是底部不紧急的 ImageView。Glide 可以用 Priority 枚举来支持你这样的行为,调用 .priority() 方法。

    .priority() 方法的参数priority(优先级):

    按照递增priority(优先级)的列表:

    Priority.LOW  
    Priority.NORMAL 
    Priority.HIGH 
    Priority.IMMEDIATE 
    

    注意:优先级并不是完全严格遵守的。Glide将会用他们作为一个准则,并尽可能的处理这些请求,但是它不能保证所有的图片都会按照所要求的顺序加载。

      private void loadImageWithHighPriority() {  
          Glide
          .with( context )
          .load( UsageExampleListViewAdapter.eatFoodyImages[0] )
          .priority( Priority.HIGH )
          .into( imageViewHero );
      }
    
      private void loadImagesWithLowPriority() {  
          Glide
          .with( context )
          .load( UsageExampleListViewAdapter.eatFoodyImages[1] )
          .priority( Priority.LOW )
          .into( imageViewLowPrioLeft );
    
          Glide
          .with( context )
          .load( UsageExampleListViewAdapter.eatFoodyImages[2] )
          .priority( Priority.LOW )
          .into( imageViewLowPrioRight );
      }
    

原文链接

http://blog.csdn.net/hshshshshs1/article/details/50786203

你可能感兴趣的:(Glide图片缓存)