1. 程式人生 > >Glide原始碼分析(一)---基本

Glide原始碼分析(一)---基本

吐槽

中秋節啊,自己身為一個單身程式猿又不回家,還是在實驗室學個新的框架吧,畢竟這個框架很實用,之前自己都還沒用過,就很尷尬。 那中秋快樂啊

本文思維導圖

Glide是什麼

答曰:一種安卓平臺上的圖形載入框架,一種很好很好用的框架

然後網上說了下picasso這個框架和Glide的對比,這個框架也是安卓上的載入圖片的一個框架,兩者有相同的地方和不同的地方

Picasso的作用:

  • 在adapter中需要取消已經不在視野範圍的ImageView圖片資源的載入,否則會導致圖片錯位,Picasso已經解決了這個問題
  • 使用複雜的圖片壓縮轉換來儘可能的減少記憶體消耗
  • 自帶記憶體和硬碟二級快取功能

Glide的作用:

  • GIF動畫的解碼
  • 本地視訊劇照的解碼
  • 縮圖的支援
  • Activity生命週期的整合
  • 轉碼的支援
  • 動畫的支援
  • OkHttp和Volley的支援
  • 其他功能:如在圖片載入過程中,使用Drawables物件作為佔位符、圖片請求的優化、圖片的寬度和高度可重新設定、縮圖和原圖的快取等功能

然後我們對比起來發現這兩者的區別:

  • Picasso所能實現的功能,Glide都能做,只是所需的設定不同
  • Picasso體積比起Glide小太多
  • Glide的好處是大型的圖片流

用法

首先我們先肯定配置下這塊 配置很簡單,只要在Module的Gradle新增依賴即可 我看了下郭神部落格裡面說的Glide最新的穩定版本是3.7.0,所以用這個吧

第一步:我們新增一個依賴和一個許可權 在app/build.gradle檔案中新增依賴

compile 'com.github.bumptech.glide:glide:3.7.0'

然後再申請網路請求許可權//因為要從網上獲取圖片

<uses-permission android:name="android.permission.INTERNET" />

第二步:載入圖片 先看下最簡單的用法,從網路上獲取一張圖片,放進一個imageView裡面 先看下佈局 很簡單的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_load"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="獲取圖片"
        />
    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

再看下邏輯程式碼:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button mbutton;
    private ImageView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mbutton = (Button)findViewById(R.id.btn_load);
        show = (ImageView)findViewById(R.id.image_view);
        mbutton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_load:
                String url = "http://att.bbs.duowan.com/forum/201611/07/1854591iuaxsub3bldtutq.png";
                Glide.with(this)
                        .load(url)
                       // .placeholder(R.drawable.noimage)
                       // .error(R.drawable.erronimage)
                        //.diskCacheStrategy(DiskCacheStrategy.NONE)
                        .into(show);
                break;

        }

    }
}

真的是超級超級簡單的框架,很輕鬆就把網路圖片就載入進去了

在這裡插入圖片描述

然後我們就發現這塊就簡單的一段程式碼就好了,真的是舒服啊

Glide.with(this).load(url).into(imageView);
  • with()這個方法是建立一個載入圖片的例項的,可以接收很多的引數,不論是在一個Activity還是在Fragment裡面,都可以的
  • load()指定載入的圖片資源,各種方式的
  • into()這塊是最好理解的,因為它就指定了要放在那個ImageView裡面,也還支援很多用法 //這塊就是簡單分析下,,,肯定要好好看這幾塊函式的

佔位圖和載入失敗的圖片

然後我們發現這塊還是不滿足我們的需求啊,因為我們還需要兩種情況下的圖片:

  • 載入時間太長怎麼辦,不能讓別人看到空白唉,很尷尬的
  • 載入失敗了怎麼辦,,,也不可能留一大堆空白唉

但是這個框架貼心的給我們弄好了這塊,自己只需要準備圖片就好了

首先先看下佔位圖

佔位圖就是指在圖片的載入過程中,我們先顯示一張臨時的圖片,等圖片加載出來了再替換成要載入的圖片。 就這種,好不容易找的圖哈哈哈

在這裡插入圖片描述

就是我們在載入圖片時候,還沒載入之前先讓這貨呆在圖片裡面,然後等我們圖片加載出來之後,就可以把這個替換掉 程式碼也很簡單:

Glide.with(this)
        .load(url)
        .placeholder(R.drawable.noimage)//加入佔位圖片
       // .error(R.drawable.erronimage)
        .diskCacheStrategy(DiskCacheStrategy.NONE)//關閉快取
        .into(show);

看下效果: 在這裡插入圖片描述

然後我們再看下載入失敗的情況下的處理:

異常佔位圖: 如果因為某些異常情況導致圖片載入失敗,比如說手機網路訊號不好,這個時候就顯示這張異常佔位圖 我也網上找了一個這個圖片 在這裡插入圖片描述

用法也是一樣的,先弄個圖片,然後再加個函式

Glide.with(this)
        .load(url)
        .placeholder(R.drawable.noimage)
        .error(R.drawable.erronimage)//異常處理的圖片方法
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .into(show);

效果如下: 在這裡插入圖片描述

載入資源型別

因為它可以載入很多東西

先看下圖片的載入: 1 載入網路資源 簡單的ULR就好了

Glide.with(context).load(internetUrl).into(ImageView);

2 從檔案中載入圖片

File file = new File(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);

3 從資源id載入圖片

int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);

4 載入Gif圖片 這個和網路上的圖片載入是一樣的

String gifUrl = "xxxxx";
Glide.with( context ).load( gifUrl ).into( imageViewGif );

//然後還有好多的方式。以後遇到再說

##指定圖片的格式和大小

這塊也很神奇,因為Glide會自動判斷圖片的格式的 就是不論是圖片還是GlF圖片的,它都會自己判斷的

然後圖片大小這塊,我們也發現這塊人家框架都考慮好了,圖片預設都是判斷lmageView的大小的,然後把圖片扔進去就好了 如果真的要自己去指定一個圖片的固定大小也可以的

Glide.with(this)
        .load(url)
        .placeholder(R.drawable.noimage)
        .error(R.drawable.erronimage)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .override(100,100)//設定圖片大小的
        .into(show);

總結

簡單的基本用法都看了下,這個框架真的很簡單的使用,所以繼續努力看這個框架的原始碼吧