Android圖片加載庫:最全面解析Glide用法

前言
-  上文已經對當今 Android主流的圖片加載庫 進行了全面介紹 & 對比 如果你還沒閱讀,我建議你先移步這里進行查看 
-  今天我們來學習一下其中一個Android主流的圖片加載庫的使用 - Glide 
目錄

目錄
1. 簡介
-  介紹:Glide,是Android中一個圖片加載開源庫 Google的開源項目 
- 主要作用:實現圖片加載
2. 功能特點
2.1 功能列表

功能列表
-  從上面可以看出,Glide不僅實現了圖片異步加載的功能,還解決了Android中加載圖片時需要解決的一些常見問題 
-  接下來,我會對Glide的每個功能點進行詳細的介紹 
2.2 功能介紹
2.2.1 關于圖片加載
-  圖片的異步加載(基礎功能) 
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
        String Url = "http://218.192.170.132/1.jpg";
//Glide使用了流式接口的調用方式
//Glide類是核心實現類。
        Glide.with(context).load(Url).into(targetImageView);
//實現圖片加載功能至少需要三個參數:
//with(Context context)
//Context對于很多Android API的調用都是必須的,這里就不多說了
//load(String imageUrl):被加載圖像的Url地址。
//大多情況下,一個字符串代表一個網絡圖片的URL。
//into(ImageView targetImageView):圖片最終要展示的地方。 
  -  設置加載尺寸 Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
-  設置加載中以及加載失敗圖片 api里面對placeholder()、error()函數中有多態實現,用的時候可以具體的熟悉一下 Glide .with(this) .load(imageUrl) .placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
-  設置加載動畫 Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);api也提供了幾個常用的動畫:比如crossFade() R.anim.item_alpha_in <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="0.0" android:toAlpha="1.0"/> </set>
-  設置要加載的內容 項目中有很多需要先下載圖片然后再做一些合成的功能,比如項目中出現的圖文混排,該如何實現目標下 
Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                imageView.setImageDrawable(resource);
            }
        }); 
  2.2.2 多樣式的媒體加載
Glide
        .with(context)
        .load(imageUrl);
        .thumbnail(0.1f);//設置縮略圖支持:先加載縮略圖 然后在加載全圖
                           //傳了一個 0.1f 作為參數,Glide 將會顯示原始圖像的10%的大小。
                          //如果原始圖像有 1000x1000 像素,那么縮略圖將會有 100x100 像素。
        .asBitmap()//顯示gif靜態圖片 
        .asGif();//顯示gif動態圖片
        .into(imageView); 
  2.2.3 關于緩存
-  設置磁盤緩存策略 Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView); //緩存參數 //ALL:緩存源資源和轉換后的資源(即所有版本,默認行為) //NONE:不作任何磁盤緩存。然而,默認的它將仍然使用內存緩存! //SOURCE:僅緩存源資源(原來的全分辨率的圖像)。 //在我們上面略縮圖的例子中,將會只有一個1000x1000 像素的圖片 //RESULT:緩存轉換后的資源(最終的圖像,即降低分辨率后的(或者是轉換后的)
-  設置跳過內存緩存 Glide .with(this) .load(imageUrl) .skipMemoryCache(true) .into(imageView); //設置跳過內存緩存 //這意味著 Glide 將不會把這張圖片放到內存緩存中去 //這里需要明白的是,這只是會影響內存緩存!Glide 將會仍然利用磁盤緩存來避免重復的網絡請求。
-  清理緩存 Glide.get(this).clearDiskCache();//清理磁盤緩存 需要在子線程中執行 Glide.get(this).clearMemory();//清理內存緩存 可以在UI主線程中進行
2.2.4 其他設置
-  生命周期集成 通過設置綁定生命周期,我們可以更加高效的使用Glide提供的方式進行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態管理起來 .with(Context context)// 綁定Context .with(Activity activity);// 綁定Activity .with(FragmentActivity activity);// 綁定FragmentActivity .with(Fragment fragment);// 綁定Fragment注意: - 傳入的context類型影響到Glide加載圖片的優化程度
- Glide可以監視Activity的生命周期,在Activity銷毀的時候自動取消等待中的請求。但是如果你使用Application context,你就失去了這種優化效果。
 
-  設置動態轉換 Glide.with(this).load(imageUrl).centerCrop().into(imageView);
-  設置下載優先級 Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
3. Demo實例
沒有Demo的代碼講解不是好文章,讓我們來一步步學會使用Glide。
步驟1:在gradle添加依賴
compile 'com.github.bumptech.glide:glide:3.7.0' 
  步驟2:添加網絡權限
<uses-permission android:name="android.permission.INTERNET"/> 
  步驟1和步驟2是Glide使用的前提,千萬別忘了!!!!
步驟3:在MainActivity中
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
        String Url = "http://218.192.170.132/1.jpg";
        Glide
                .with(this)
                .load(Url)
                .into(targetImageView); 
  還有具體其他功能需要配置的自己按照我上面寫的進行配置就好了~
這里再貼上Glide的Github地址: 請點擊這里
4. 特點
4.1 優點
-  多樣化媒體加載 Glide 不僅是一個圖片緩存,它支持 Gif、WebP、縮略圖。甚至是 Video 
-  生命周期集成 通過設置綁定生命周期,我們可以更加高效的使用Glide提供的方式進行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態管理起來 
-  高效的緩存策略 A. 支持Memory和Disk圖片緩存 B. Picasso 只會緩存原始尺寸的圖片,而 Glide 緩存的是多種規格,也就意味著 Glide 會根據你 ImageView 的大小來緩存相應大小的圖片尺寸 比如你ImageView大小是200 200,原圖是400 400 ,而使用Glide就會緩存200 200規格的圖,而 Picasso只會緩存400 400規格的。這個改進就會導致Glide比Picasso加載的速度要快,畢竟少了每次裁剪重新渲染的過程,非常靈活 & 加載速度快 C. 內存開銷小 默認的Bitmap格式是RGB_565格式,而Picasso默認的是ARGB_8888格式,這個內存開銷要小一半。 Android關于圖片內存計算,共有四種,分別是: -  ALPHA_8:每個像素占用1byte內存 
-  ARGB_4444:每個像素占用2byte內存 
-  ARGB_8888:每個像素占用4byte內存(默認,色彩最細膩=顯示質量最高=占用的內存也最大) 
-  RGB_565:每個像素占用2byte內存(8bit = 1byte) 
 舉例說明:一個32位的PNG=ARGB_8888=1204x1024,那么占用空間是:1024x1024x(32/8) = 4,194,304kb=4M左右
 在解析圖片的時候,為了避免oom和節省內存,最好使用ARGB_4444模式(節省一半的內存空間)
 
-  
4.2 缺點
-  使用方法復雜 
 由于Glide其功能強大,所以使用的方法非常多,其源碼也相對的復雜
-  包較大 
5. 相比其他圖片加載庫(Picasso & Fresco)
-  對比Picasso 
 Glide 是在Picasso 基礎之上進行的二次開發做了不少改進,不過這也導致包比 Picasso 大不少,不過也就不到 500k(Picasso 是100多k),用法較為復雜,不過畢竟級別還是蠻小的,影響不是很大
-  對比Fresco 
 使用較Fresco簡單,但性能(加載速度 & 緩存)卻比不上Fresco
6. 應用場景
根據Glide的特點和與其他圖片加載庫的對比,可以得出其使用場景:
-  需要更多的內容表現形式(如Gif); 
-  更高的性能要求(緩存 & 加載速度); 
來自:http://www.jianshu.com/p/c3a5518b58b2