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);
總結
簡單的基本用法都看了下,這個框架真的很簡單的使用,所以繼續努力看這個框架的原始碼吧