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狀態(tài)在暫停加載,在Resumed的時候又自動重新加載)

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

默認Bitmap格式是RGB_565

Clide默認使用Bitmap格式是RGB_565加載圖片,比ARGB_8888格式的內(nèi)存開銷要小一半,但同時會帶來圖片顯示質(zhì)量下降,可以通過創(chuàng)建一個新的GlideModule將Bitmap格式轉(zhuǎn)換到ARGB_8888,提升圖片質(zhì)量

  • 自定義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緩存一次。盡管一張圖片已經(jīng)緩存了一次,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調(diào)整成新尺寸的大小,然后將這個尺寸的也緩存起來。具體說來就是:假如在第一個頁面有一個200x200的ImageView,在第二個頁面有一個100x100的ImageView,這兩個ImageView本來是要顯示同一張圖片,卻需要下載兩次;可以通過改變Glide的行為讓它即加載全尺寸圖片,也加載不同尺寸圖片

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

下次在任何ImageView中加載圖片的時候,全尺寸的圖片將從緩存中取出,重新調(diào)整大小,然后緩存。

Clide常用屬性

  • 占位符使用

    如果要使用Gilde顯示一張網(wǎng)絡(luò)上的圖片,當網(wǎng)絡(luò)不好的時候加載圖片可能需要很長的時間,一個空的ImageViewzai 在任何UI上都不好看,這就有了占位符,在圖片加載完成以前顯示占位符。

    Glide 的流式接口讓這個變得非常容易的去做到!只需要調(diào)用 .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接受所有的值(可以是本地的資源也可以是網(wǎng)絡(luò)上的資源)

  • 錯誤占位符

    可以從字面的意思來理解什么是錯誤的占位符,也就是我們的APP從一個網(wǎng)站去加載一張圖片的時候,返回時告訴我們獲取失敗,這時就用到了錯誤占位符來顯示圖片,如果想進行一些其他操作,可自己決定。

    調(diào)用 Glide 的流式接口和之前顯示預(yù)加載占位符的例子是相同的,不同的是調(diào)用了名為 error() 的函數(shù)。

      Glide
      .with(context)
      .load("http://futurestud.io/non_existing_image.png")
      .placeholder(R.mipmap.ic_launcher) //添加占位圖片
      .error(R.mipmap.future_studio_launcher) //添加獲取網(wǎng)絡(luò)圖片失敗占位圖片
      .into(imageViewError);
    
  • crossFade()通過該方法Glide會默認提供一個平滑(漸入漸出)動畫用于加載圖片,crossFade() 方法還有另外重載方法.crossFade(intduration)。如果你想要去減慢(或加快)動畫,隨時可以傳一個毫秒的時間給這個方法。動畫默認的持續(xù)時間是 300毫秒。

  • dontAnimate():顯示圖片而沒有任何淡入淡出效果,在Glide的建造者中調(diào)用.dontAnimate()

  • override(horizontalSize, verticalSize):用override(horizontalSize, verticalSize)調(diào)整圖片大小

  • 圖像縮放

    現(xiàn)在,對于任何圖像操作,調(diào)整大小真的能讓長寬比失真并且丑化圖像顯示。在你大多數(shù)的使用場景中,你想要避免發(fā)生這種情況。Glide 提供了一般變化去處理圖像顯示。提供了兩個標準選項:centerCrop 和 fitCenter

    CenterCrop:CenterCrop()是一個裁剪技術(shù),即縮放圖像讓它填充到 ImageView 界限內(nèi)并且側(cè)鍵額外的部分。ImageView 可能會完全填充,但圖像可能不會完整顯示.

       Glide
      .with(context)
      .load(UsageExampleListViewAdapter.eatFoodyImages[0])
      .override(600, 200) //調(diào)整圖片大小
      .centerCrop() //圖片縮放
      .into(imageViewResizeCenterCrop);
    

    FitCenter:fitCenter() 是裁剪技術(shù),即縮放圖像讓圖像都測量出來等于或小于ImageView的邊界范圍。該圖像將會完全顯示,但可能不會填滿整個ImageView。

      Glide
      .with(context)
      .load(UsageExampleListViewAdapter.eatFoodyImages[0])
      .override(600, 200) //調(diào)整圖片大小
      .fitCenter()  //圖片縮放
      .into(imageViewResizeFitCenter);
    

    總結(jié):平時在使用的時候還是CenterCrop()的時候多一些,就像ImageView里面也會用到android: scaleType="centerCrop"

  • 內(nèi)存緩存

    調(diào)用了.skipMemoryCache(true) 去明確告訴 Glide 跳過內(nèi)存緩存,這意味著 Glide 將不會把這張圖片放到內(nèi)存緩存中去,這里需要明白的是,這只是會影響內(nèi)存緩,Glide將會仍然利用磁盤緩存來避免重復(fù)的網(wǎng)絡(luò)請求。

      Glide 
      .with( context ) 
      .load( eatFoodyImages[0] ) 
      .skipMemoryCache( true ) //設(shè)置禁止Glide將圖片寫到內(nèi)存緩存中
      .into( imageViewInternet );
    
  • 跳過磁盤緩存

    用.diskCacheStrategy()方法為Glide改變磁盤緩存的行為,不同的于.skipMemoryCache() 方法,它需要一個枚舉而不是一個簡答的布爾值,如果你想要為一個請求禁用磁盤緩存,使用枚舉 DiskCacheStrategy.NONE

      Glide  
      .with( context )
      .load( eatFoodyImages[0] )
      .diskCacheStrategy( DiskCacheStrategy.NONE )//禁止磁盤緩存
      .skipMemoryCache(true) //禁止內(nèi)存緩存
      .into( imageViewInternet );
    
  • 圖片請求的優(yōu)先級

    通常,你會遇到這樣的使用場景:你的App將會需要在同一時間內(nèi)加載多個圖像。讓我們假設(shè)你正在構(gòu)建一個信息屏幕,這里有一張很大的英雄圖片在頂部,還有兩個小的,在底部還有一些不那么重要的圖片。對于最好的用戶體驗來說,應(yīng)用圖片元素是顯示要被加載和顯示的,然后才是底部不緊急的 ImageView。Glide 可以用 Priority 枚舉來支持你這樣的行為,調(diào)用 .priority() 方法。

    .priority() 方法的參數(shù)priority(優(yōu)先級):

    按照遞增priority(優(yōu)先級)的列表:

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

    注意:優(yōu)先級并不是完全嚴格遵守的。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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容