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基本使用

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

      <meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration"  
          android:value="GlideModule"/>
    

磁盘缓存

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

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

推荐阅读更多精彩内容