1. 程式人生 > >Android圖片載入庫:最全面解析Glide用法

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

注意:
1. 傳入的context型別影響到Glide載入圖片的優化程度
2. 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關於圖片記憶體計算,共有四種,分別是:

    1. ALPHA_8:每個畫素佔用1byte記憶體
    2. ARGB_4444:每個畫素佔用2byte記憶體
    3. ARGB_8888:每個畫素佔用4byte記憶體(預設,色彩最細膩=顯示質量最高=佔用的記憶體也最大)
    4. 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);
  • 更高的效能要求(快取 & 載入速度);

7. 總結

  • Glide使用起來是不是非常簡單?相信你看完這篇文章後你能全面掌握Glide的用法
  • 但是Glide的原始碼卻不簡單,接下來我會對Glide的原始碼進行詳細分析,如果感興趣的話可以繼續關注Carson_Ho的安卓開發筆記!!!!

請幫頂或評論點贊!因為你的鼓勵是我寫作的最大動力!