圖片加載庫簡單使用以及介紹


圖片網絡加載庫




目前市面上主流的圖片加載框架有四種:Glide Picasso Fresco ImageLoader



  • ImageLoader:一個強大的圖片加載庫,包含各種各樣的配置,最老牌,使用也最廣泛。

  • Picasso: Square出品,必屬精品。和OkHttp搭配起來更配呦!

  • Fresco:Facebook出的,天生驕傲!不是一般的強大。

  • Glide:Google推薦的圖片加載庫,專註於流暢的滾動。




Glide


1.Glide簡介


在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹瞭一個名叫 Glide 的圖片加載庫,作者是bumptech。這個庫被廣泛的運用在google的開源項目中,包括2014年google I/O大會上發佈的官方app。創建Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果,另一個是支持遠程圖片的獲取、大小調整和展示。


2.Glide特點


(1)使用簡單
(2)可配置度高,自適應程度高
(3)支持常見圖片格式 Jpg png gif webp
(4)支持多種數據源 網絡、本地、資源、Assets 等
(5)高效緩存策略 支持Memory和Disk圖片緩存 默認Bitmap格式采用RGB_565內存使用至少減少一半
(6)生命周期集成 根據Activity/Fragment生命周期自動管理請求
(7)高效處理Bitmap 使用Bitmap Pool使Bitmap復用,主動調用recycle回收需要回收的Bitmap,減小系統回收壓力

3.Glide下載地址


https://github.com/bumptech/glide

4.Glide一些功能


(1)Glide基本可以load任何可以拿到的媒體資源
(2)禁止,清除內存緩存
(3)禁止,清除磁盤緩存
(4)本地視頻劇照的解碼
(5)獲取緩存大小
(6)指定資源的優先加載順序
(7)先顯示縮略圖,再顯示原圖
(8)對圖片進行裁剪、模糊、濾鏡、圖片請求的優化、圖片的寬度和高度可重新設定等處理
(9)對請求狀態進行監聽
(10)對資源的下載進度進行監聽

5.Glide使用步驟


    a.在build中添加依賴(這裡需要註意使用Glide還需要support-v4庫)
compile 'com.github.bumptech.glide:glide:3.7.0'
添加權限
<uses-permission android:name="android.permission.INTERNET"/>
b.加載網絡圖片(也是最基本的使用)
Glide.with(this).load("url").into(ivGlide1);
c.加載資源圖片
Glide.with(this).load(R.mipmap.ic_launcher).into(ivGlide2);
e.加載本地圖片
String path =Environment.getExternalStorageDirectory()+"/shili1.jpg";
File file = new File(path);
Uri uri = Uri.fromFile(file);
Glide.with(this).load(uri).into(ivGlide3);
f.加載網絡gif
String gifUrl = "http://b.hiphotos.baidu.com/zhidao/pic/item/faedab64034f78f066abccc57b310a55b3191c67.jpg";
//.placeholder()設置資源加載過程中的顯示的Drawable error()加載失敗的圖片
Glide.with(this).load(gifUrl).placeholder(R.mipmap.ic_launcher).into(ivGlide4);
g.加載資源gif
Glide.with(this).load(R.drawable.loading).asGif().placeholder(R.mipmap.ic_launcher).into(ivGlide5);
h.加載本地gif
String gifPath = Environment.getExternalStorageDirectory()+"/shili2.jpg";
File gifFile = new File(gifPath);
Glide.with(this).load(gifFile).placeholder(R.mipmap.ic_launcher).into(ivGlide6);
i.加載本地小視頻和快照
String videoPath =Environment.getExternalStorageDirectory()+"/video.mp4";;
File videoFile = new File(videoPath);
Glide.with(this).load(Uri.fromFile(videoFile)).placeholder(R.mipmap.ic_launcher).into(ivGlide7);
j.設置縮略圖比例,然後,先加載縮略圖,再加載原圖
String urlPath="/storage/emulated/0/shili1.jpg";
Glide.with(this).load(new File(urlPath)).thumbnail(0.1f).centerCrop().placeholder(R.mipmap.ic_launcher).into(ivGlide8);
k.先建立一個縮略圖對象,然後,先加載縮略圖,再加載原圖
DrawableRequestBuilder thumbnailRequest= Glide.with(this).load(new File(urlPath));
Glide.with(this).load(Uri.fromFile(videoFile)).thumbnail(thumbnailRequest).centerCrop().placeholder(R.mipmap.ic_launcher).into(ivGlide9);

6.Glide推薦博客


http://blog.csdn.net/shangmingchao/article/details/51125554
http://www.cnblogs.com/whoislcj/p/5558168.html

Picasso


1.Picasso簡介


Picasso是Square公司出品的一個強大的圖片下載和緩存圖片庫


2.Picasso特點


1)在adapter中需要取消已經不在視野范圍的ImageView圖片資源的加載,否則會導致圖片錯位,Picasso已經解決瞭這個問題。
2)使用復雜的圖片壓縮轉換來盡可能的減少內存消耗
3)自帶內存和硬盤二級緩存功能

3.Picasso下載地址


https://github.com/square/picasso

4.Picasso使用


a.導入jar包或在module的gradle文件中添加
compile 'com.squareup.picasso:picasso:2.5.2'
b.Picasso.with(context).load(imageUrl).into(imageView);
c.資源加載的方法
- placeholder(xxx). 設置資源加載過程中的顯示的Drawable。
- error(xxx).設置load失敗時顯示的Drawable。
- into(xxx) 設置資源加載到的目標 包括ImageView Target等

Fresco


1.Fresco簡介


Fresco是Facebook最新推出的一款用於Android應用中展示圖片的強大圖片庫,可以從網絡、本地存儲和本地資源中加載圖片。相對於ImageLoader,擁有更快的圖片下載速度以及可以加載和顯示gif圖等諸多優勢,是個很好的圖片框架。


2.Fresco特點


1)內存管理
在5.0以下系統,Fresco將圖片放到一個特別的內存區域。當然,在圖片不顯示的時候,占用的內存會自動被釋放。這會使得APP更加流暢,減少因圖片內存占用而引發的OOM。
內存分配采用:系統匿名共享內存
2)漸進式呈現圖片
漸進式圖片格式先呈現大致的圖片輪廓,然後隨著圖片下載的繼續, 呈現逐漸清晰的圖片,這對於移動設備,尤其是慢網絡有極大的利好,可帶來更好的用戶體驗。
3)支持加載Gif圖,支持**WebP**格式。
4)圖像的呈現
(1)自定義居中焦點(對人臉等圖片顯示非常有幫助)。
(2)圓角圖,當然圓圈也行。
(3)下載失敗之後,點擊重新下載。
(4)自定義占位圖,自定義overlay, 或者進度條。
(5)指定用戶按壓時的overlay。
5)圖像的加載
(1)為同一個圖片指定不同的遠程路徑,或者使用已經存在本地緩存中的圖片。
(2)先顯示一個低解析度的圖片,等高清圖下載完之後再顯示高清圖。
(3)加載完成回調通知。
(4)對於本地圖,如有EXIF縮略圖,在大圖加載完成之前,可先顯示縮略圖。
(5)縮放或者旋轉圖片。
(6)處理已下載的圖片。

3.Fresco下載地址


https://github.com/facebook/fresco
官方使用網址:
http://fresco-cn.org/docs/index.html

4.Fresco的使用


(1)添加依賴
dependencies {
// 在 API < 14 上的機器支持 WebP 時,需要添加
compile 'com.facebook.fresco:animated-base-support:0.14.1'

// 支持 GIF 動圖,需要添加
compile 'com.facebook.fresco:animated-gif:0.14.1'

// 支持 WebP (靜態圖+動圖),需要添加
compile 'com.facebook.fresco:animated-webp:0.14.1'
compile 'com.facebook.fresco:webpsupport:0.14.1'

// 僅支持 WebP 靜態圖,需要添加
compile 'com.facebook.fresco:webpsupport:0.14.1'

compile 'com.facebook.fresco:fresco:0.14.1'
}
(2)在application中初始化Fresco
Fresco.initialize(this);
(3)配置網絡權限
<uses-permission android:name="android.permission.INTERNET"/>
(4)在xml佈局文件中,加入命名空間
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
(5)在xml中引入SimpleDraweeView
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/my_drawable"
/>
(6)在Java代碼中開始加載圖片
Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");

SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);

draweeView.setImageURI(uri);

5.常用的API


android:layout_width="20dp"   // 不支持wrap_content, 如果要設置寬高比, 需要在Java代碼中指定setAspectRatio(float ratio);
android:layout_height="20dp" // 不支持wrap_content
fresco:placeholderImage="@color/wait_color" // 下載成功之前顯示的圖片
fresco:placeholderImageScaleType="fitCenter" // 設置圖片縮放. 通常使用focusCrop,該屬性值會通過算法把人頭像放在中間
fresco:failureImage="@drawable/error" // 加載失敗的時候顯示的圖片
fresco:failureImageScaleType=“centerInside"// 設置圖片縮放
fresco:retryImage="@drawable/retrying" // 加載失敗,提示用戶點擊重新加載的圖片(會覆蓋failureImage的圖片)
fresco:roundAsCircle="true" // 設置圓形方式顯示圖片

6.Fresco推薦博客


http://blog.csdn.net/u011771755/article/details/47608191
https://github.com/NateRobinson/FrescoStudyDemo

對比


和ImageLoader對比


ImageLoader作為比較老的框架,也是我們一直使用的框架,其它先不說最起碼穩定, 加載速度適中,支持圖片下載的過程監聽,豐富的配置選項


缺點:
1.不支持GIF圖片加載
2.並且緩存機制沒有和http的緩存很好的結合, 完全是自己的一套緩存機制(完整大小).
3.進過測試Glide和Fresco取消在結束的時候內存消耗都有明顯的下降趨勢,這是因為他們和Activity的生命周期綁定瞭,在生命周期結束的時候會自動釋放掉內存占用,但是Picasso和ImageLoader需要自己手動去釋放。
4.相對於Glide來說ImageLoader,如果在非購物類的App中來說不需要大量的圖片處理,隻需要最基本的圖片展示,ImageLoader相對而言代碼量就比較多使用也更加繁瑣。
5.最重要一點ImageLoader已經停止維護,也就是說以後出現的任何的bug都不會修復,任何的新特性都不會再繼續開發



Glide和Picasso


1.Glide和Picasso其實是非常相似,Glide加載圖片的方法和Picasso如出一轍。例如:


Picasso.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
看起來好像是一樣的沒有什麼區別,但是相比交Picasso來言Glide的with方法不光接受Context,還接受Activity 和 Fragment,Context會自動的從他們獲取。
同時將Activity/Fragment作為with()參數的好處是:圖片加載會和Activity/Fragment的生命周期保持一致,比如 Paused狀態在暫停加載,在Resumed的時候又自動重新加載。所以我建議傳參的時候傳遞Activity 和 Fragment給Glide,而不是Context。

2.Glide默認加載的是RGB_565 Picasso默認加載的是RGB_8888 當然這樣的出現的現象就是Picasso比Glide更加清晰,但是相應的內存消耗也更加大


3.Picasso是加載瞭全尺寸的圖片到內存,然後讓GPU來實時重繪大小。而Glide加載的大小和ImageView的大小是一致的,因此更小。雖然說Picasso也可以指定加載的圖片大小但這樣需要我們主動計算ImagerView的大小,這樣來說明顯Glider更加優勢


4.Picasso和Glide在磁盤緩存策略上有很大的不同。Picasso緩存的是全尺寸的,而Glide緩存的是跟ImageView尺寸相同的。Glide的這種方式優點是加載顯示非常快。而Picasso的方式則因為需要在顯示之前重新調整大小而導致一些延遲。


5.如果將Glide恢復到全尺寸的話沒有Picasso顯示的平滑


6.Glide可以加載GIF動態圖,而Picasso不能。


7.Picasso (v2.5.1)的大小約118kb,而Glide (v3.5.2)的大小約430kb。Picasso和Glide的方法個數分別是840和2678個。


總結:Glide可以說是 Picasso 的升級版, 有 Picasso 的優點, 並且支持 GIF 圖片加載顯示, 圖片緩存也會自動縮放, 默認使用RGB_565 格式緩存圖片, 是 Picasso 緩存體積的一半.Glide也支持本地視頻圖片加載




Fresco


Fresco在上面也一一列舉瞭,總結來說就是:更好的內存管理和更強大的功能。


Fresco在綜合瞭之前圖片加載庫的優點的基礎上利用本地代碼做瞭性能上的優化。不過編譯完成的文件就2M多,如果不是圖片比較多的應用沒有太大必要使用。


優點:
1. 圖片存儲在安卓系統的匿名共享內存(Ashmem區), 而不是虛擬機的堆內存中, 圖片的中間緩沖數據也存放在本地堆內存,所以, 應用程序有更多的內存使用, 不會因為圖片加載而導致 oom, 同時也減少垃圾回收器頻繁調用回收 Bitmap導致的界面卡頓, 性能更高.
2. 漸進式加載 JPEG 圖片, 支持圖片從模糊到清晰加載
3. 圖片可以以任意的中心點顯示在 ImageView, 而不僅僅是圖片的中心.
4. JPEG 圖片改變大小也是在 native 進行的, 不是在虛擬機的堆內存, 同樣減少 OOM
5. 很好的支持 GIF 圖片的顯示
缺點:
1. 框架較大, 影響 Apk 體積
2. 使用較繁瑣,他隻能用內置的一個ImageView來實現這些功能,用起來比較麻煩,我們通常是根據Fresco自己改改,直接使用他的Bitmap層。

0 個評論

要回覆文章請先登錄註冊