Android 圖片加載框架之(Glide和Picasso的區別,Glide的簡單使用)

Glide,一個被google所推薦的圖片加載庫,常見的還有Picasso,Fresco等,每一個都非常穩定,功能也都十分強大。但是它們的使用場景基本都是重合的,也就是說我們基本只需要選擇其中一個來進行學習和使用就足夠了,每一個框架都嘗試去掌握的話則有些浪費時間。最常用的是Glide和Picasso,今天就針對於Glide和Picasso的區別,以及Glide的簡單使用來進行具體介紹

Picasso的基本用法:

Picasso.with(this) .load(“http://nuuneoi.com/uploads/source/playstore/cover.jpg“) .into(ivImgPicasso);

Picasso.with(this) .load(“http://nuuneoi.com/uploads/source/playstore/cover.jpg“) .resize(768, 432) .into(ivImgPicasso);

Picasso.with(this) .load(“http://nuuneoi.com/uploads/source/playstore/cover.jpg“) .fit() .centerCrop() .into(ivImgPicasso);

這三種方法都可以加載圖片顯示到頁面上,

第一種:加載了全尺寸的圖片到內存,然後讓GPU來實時重繪大小

第二種:你需要主動計算ImageView的大小,或者說你的ImageView大小是具體的值(而不是wrap_content),

第三種:按統一比例縮放圖片(保存圖片的尺寸比例)便於圖片的二維(寬度和高度)等於或者大於相應的視圖的維度,這種方法和Glide加載圖片佔用的內存幾乎是相同的,雖然內存開銷差距不大,但是在這個問題上Glide完勝Picasso。因爲Glide可以自動計算出任意情況下的ImageView的大小。

Glide的基本用法:

Glide.with(this) .load("圖片的URL") .into(ivImgGlide);

load方法中不僅可以傳入圖片地址,還可以傳入圖片文件File,resource,圖片的byte數組等

Glide與Picasso的區別:

1、內存:

            加載同一張圖片Picasso,Picasso的內存開銷仍然遠大於Glide。

2、Image質量的細節:


            Glide默認的是Bitmap格式是RGB-565

            Picasso默認ARGB_8888格式

           Glide加載的圖片沒有Picasso那麼平滑,但是很難察覺

3、磁盤緩存:      

        (1)Picasso緩存的是全尺寸的。而Glide緩存的跟ImageView尺寸相同

      (2)將ImageView調整成不同大小不管大小如何設置。Picasso只緩存一個全尺寸的。Glide則不同,它會爲每種大小的ImageView緩存一次

            讓Glide既緩存全尺寸又緩存其他尺寸的方法:

Glide.with(this) .load(“http://nuuneoi.com/uploads/source/playstore/cover.jpg“) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(ivImgGlide);

Glide的這種方式優點是加載顯示非常快。而Picasso的方式則因爲需要在顯示之前重新調整大小而導致一些延遲,Glide比Picasso快,雖然需要更大的空間來緩存。

4、Gif動圖

            Glide可以加載Gif動圖,Picasso不可以加載動圖

            Glide動畫會消耗太多的內存,因此使用時謹慎使用

總結一下他們之間的區別:

(1)Glide比Picasso加載速度快,但Glide比Picasso需要更大的空間來緩存;

(2)Glide加載圖像及磁盤緩存的方式都優於Picasso,且Glide更有利於減少OutOfMemoryError的發生;

(3)Glide可以加載Gif動圖,Picasso不可以加載動圖

(4)Picasso加載的圖片比Glide加載的圖片平滑(可忽略不計)

Glide的具體使用方法:

1、基本使用:

添加依賴,現在Glide最新的依賴有4.x.x的
dependencies {
    compile 'com.github.bumptech.glide:glide:3.7.0'
}
基本使用是:

Glide.with(this).load(url).into(imageView);

2、with()

this可以是:

Context
Activity
Fragment
FragmentActivity
ApplicationContext
Context、Activity、Fragment、FragmentActivity,都是glide經過方法都是向activity中添加一個fragment,因爲glide無法直接獲取到activity,添加一個與activity綁定的fragment,可以保證glide隨着activity的生命週期變化而停止暫時取消加載請求。

3、load()

load是核心的請求方法, 在源碼中我們可以看到是在這裏進行網絡請求,

// 加載本地圖片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);
 
// 加載應用資源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
 
// 加載二進制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
 
// 加載Uri對象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);

4、佔位圖

我們在實際加載圖片的時候,由於各種原因比如網慢,一時無法請求回數據時,考慮到用戶體驗,一個佔位圖也是非常重要的

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .into(imageView);

5、動圖

asBitmap()去加載gif圖片,那麼只會顯示靜態圖片,並且只顯示動圖的第一幀 
.asGif()去加載靜態圖片會顯示錯誤圖片,報錯。

Glide.with(this)
     .load(url)
     .asBitmap()
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

6、Glide 使用加載動畫和禁止動畫

glide默認有淡入淡出動畫.crossFade()也可以不加,也有重載.crossFade(int duration),主要設置動畫進行快慢,默認是300毫秒。

Glide
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.ic_launcher) 
    .error(R.mipmap.future_studio_launcher)
    .crossFade()
    .into(imageViewFade);

7、設置圖片大小;

.override(300, 200);   //設置加載圖片尺寸大小

8、圖片請求的優先級

Glide可以通過Priority枚舉來設置加載圖片的優先級,具體使用場景就是,我們點擊一個頁面時,先加載頁面中重要的圖片,再加載那些子圖像


Priority (優先級)枚舉給了四個不同的選項,下面是按照遞增priority(優先級)的

Priority.LOW 最低
Priority.NORMAL 正常
Priority.HIGH 最高
Priority.IMMEDIATE 立即
注意:優先級並不是完全嚴格遵守的。Glide 將會用他們作爲一個準則,並儘可能的處理這些請求,但是它不能保證所有的圖片都會按照所要求的順序加載。

.priority(Priority.HIGH); 

9、縮略圖

縮略圖不同於前面提到的佔位圖。佔位圖應當是跟app綁定在一起的資源。縮略圖是一個動態的佔位圖,可以從網絡加載。縮略圖也會被先加載,直到實際圖片請求加載完畢。如果因爲某些原因,縮略圖獲得的時間晚於原始圖片,它並不會替代原始圖片,而是簡單地被忽略掉。具體的應用場景有很多,可以提供幾張圖片便於大家理解

圖中的1,2,3,4,5,6就是縮略圖,7,就是原圖;這樣大家應該會理解一點了,我覺得吧(這裏只是說一下自己的觀點)縮略圖一是用戶體驗較好,從用戶的角度,我們已經看見了一個小版本的圖片。點擊纔會加載同樣的圖片(高分辨率),二是省流量,一張原圖或許需要幾M但是一張縮略圖或許只需要幾K,

那怎麼加載縮略圖呢?Glide提供了2個不同的方法產生縮略圖。

第一種,是通過在加載的時候指定一個小的分辨率,產生一個縮略圖。

.thumbnail( 0.1f )裏面的參數是一個浮點乘法運算
這個方法是啥意思呢?
例如,傳遞一個0.1f作爲參數,Glide會加載原始圖片大小的10%的圖片。

原始圖片---->1000x1000像素,

則縮略圖---->100x100像素。

由於圖片將會比ImageView小,你需要確保縮放類型是否正確。

注意:你所有的請求設置都會影響到你的縮略圖。例如,如果你使用了一個變換讓你的圖片變爲灰度圖,縮略圖也同樣將會是灰度圖。

第二個方法是傳遞一個新的Glide請求作爲參數,我們看看例子:

這種方法的應用場景:雖然用.thunmbnail()這種方法簡單有效,但也不是總有意義的。爲啥這麼說呢,如果縮略圖需要從網絡加載同樣全分辨率圖片,可能不是不快。所以提供了第二種方法

DrawableRequestBuilder<String> thumbnailRequest = Glide
        .with( context )
        .load( eatFoodyImages[2] );
 
    Glide
        .with( context )
        .load( UsageExampleGifAndVideos.gifUrl )
        .thumbnail( thumbnailRequest )
        .into( imageView3 );

第一個縮略圖請求跟第二個是完全沒有關係的,可以是不同的Url,對其進行不同的轉換

如果你覺得不夠刺激,你還可以用遞歸用一個額外的縮略圖去請求一個縮略圖

10、緩存

 我們都知道Glide是自帶緩存的,所有的圖片請求都會被緩存在內存和磁盤上。大多數情況下,緩存是一個非常有用的東西,但在一些特殊的情況下並不是很明智。比如,如果你有一張不段變化的圖片,但是都是用的同一個URL,這時候就需要我們避免緩存,Glide提供了一些方法避免內存存儲和磁盤存儲;

禁止內存存儲:

.skipMemoryCache( true )

去特意告訴Glide跳過內存緩存,這個隻影響內存緩存!Glide爲了避免以後的網絡請求,仍然會緩存到磁盤。

禁止磁盤存儲:

如果你想要禁止請求的磁盤緩存,使用枚舉型變量DiskCacheStrategy.NONE作爲參數。

.diskCacheStrategy( DiskCacheStrategy.NONE )
.diskCacheStrategy()中枚舉參數以及意義:

DiskCacheStrategy.NONE 啥也不緩存
 
DiskCacheStrategy.SOURCE 只緩存全尺寸圖.
 
DiskCacheStrategy.RESULT 只緩存最終降低分辨後用到的圖片
 
DiskCacheStrategy.ALL 緩存所有類型的圖片 (默認)

結合兩個方法就可以同時禁止內存存儲和磁盤緩存了
--------------------- 
作者:景二倩 
來源:CSDN 
原文:https://blog.csdn.net/jing_80/article/details/81020718 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章