Glide敦腔,一個(gè)被google所推薦的圖片加載庫(kù),常見(jiàn)的還有Picasso恨溜,F(xiàn)resco等符衔,每一個(gè)都非常穩(wěn)定找前,功能也都十分強(qiáng)大。但是它們的使用場(chǎng)景基本都是重合的判族,也就是說(shuō)我們基本只需要選擇其中一個(gè)來(lái)進(jìn)行學(xué)習(xí)和使用就足夠了躺盛,每一個(gè)框架都嘗試去掌握的話則有些浪費(fèi)時(shí)間。最常用的是Glide和Picasso,今天就針對(duì)于Glide和Picasso的區(qū)別形帮,以及Glide的簡(jiǎn)單使用來(lái)進(jìn)行具體介紹
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);
這三種方法都可以加載圖片顯示到頁(yè)面上槽惫,
第一種:加載了全尺寸的圖片到內(nèi)存,然后讓GPU來(lái)實(shí)時(shí)重繪大小
第二種:你需要主動(dòng)計(jì)算ImageView的大小辩撑,或者說(shuō)你的ImageView大小是具體的值(而不是wrap_content)界斜,
第三種:按統(tǒng)一比例縮放圖片(保存圖片的尺寸比例)便于圖片的二維(寬度和高度)等于或者大于相應(yīng)的視圖的維度,這種方法和Glide加載圖片占用的內(nèi)存幾乎是相同的合冀,雖然內(nèi)存開(kāi)銷差距不大各薇,但是在這個(gè)問(wèn)題上Glide完勝Picasso。因?yàn)镚lide可以自動(dòng)計(jì)算出任意情況下的ImageView的大小君躺。
Glide的基本用法:
Glide.with(this)?.load("圖片的URL")?.into(ivImgGlide);
load方法中不僅可以傳入圖片地址峭判,還可以傳入圖片文件File,resource棕叫,圖片的byte數(shù)組等
Glide與Picasso的區(qū)別:
1林螃、內(nèi)存:
????????????加載同一張圖片Picasso,Picasso的內(nèi)存開(kāi)銷仍然遠(yuǎn)大于Glide俺泣。
2疗认、Image質(zhì)量的細(xì)節(jié):
????????????Glide默認(rèn)的是Bitmap格式是RGB-565
????????????Picasso默認(rèn)ARGB_8888格式
????????? ?Glide加載的圖片沒(méi)有Picasso那么平滑,但是很難察覺(jué)
3砌滞、磁盤緩存:? ?? ?
????????(1)Picasso緩存的是全尺寸的侮邀。而Glide緩存的跟ImageView尺寸相同
??????(2)將ImageView調(diào)整成不同大小不管大小如何設(shè)置。Picasso只緩存一個(gè)全尺寸的贝润。Glide則不同,它會(huì)為每種大小的ImageView緩存一次
????????????讓Glide既緩存全尺寸又緩存其他尺寸的方法:
Glide.with(this)?.load(“http://nuuneoi.com/uploads/source/playstore/cover.jpg“)?.diskCacheStrategy(DiskCacheStrategy.ALL)?.into(ivImgGlide);
Glide的這種方式優(yōu)點(diǎn)是加載顯示非陈料快打掘。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致一些延遲,Glide比Picasso快鹏秋,雖然需要更大的空間來(lái)緩存尊蚁。
4、Gif動(dòng)圖
????????????Glide可以加載Gif動(dòng)圖侣夷,Picasso不可以加載動(dòng)圖
????????????Glide動(dòng)畫(huà)會(huì)消耗太多的內(nèi)存横朋,因此使用時(shí)謹(jǐn)慎使用
總結(jié)一下他們之間的區(qū)別:
(1)Glide比Picasso加載速度快,但Glide比Picasso需要更大的空間來(lái)緩存百拓;
(2)Glide加載圖像及磁盤緩存的方式都優(yōu)于Picasso琴锭,且Glide更有利于減少OutOfMemoryError的發(fā)生晰甚;
(3)Glide可以加載Gif動(dòng)圖,Picasso不可以加載動(dòng)圖
(4)Picasso加載的圖片比Glide加載的圖片平滑(可忽略不計(jì))
Glide的具體使用方法:
1决帖、基本使用:
添加依賴厕九,現(xiàn)在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經(jīng)過(guò)方法都是向activity中添加一個(gè)fragment板甘,因?yàn)間lide無(wú)法直接獲取到activity同仆,添加一個(gè)與activity綁定的fragment倚舀,可以保證glide隨著activity的生命周期變化而停止暫時(shí)取消加載請(qǐng)求细睡。
3谷羞、load()
load是核心的請(qǐng)求方法, 在源碼中我們可以看到是在這里進(jìn)行網(wǎng)絡(luò)請(qǐng)求纹冤,
// 加載本地圖片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);
// 加載應(yīng)用資源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
// 加載二進(jìn)制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
// 加載Uri對(duì)象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
4洒宝、占位圖
我們?cè)趯?shí)際加載圖片的時(shí)候,由于各種原因比如網(wǎng)慢萌京,一時(shí)無(wú)法請(qǐng)求回?cái)?shù)據(jù)時(shí)雁歌,考慮到用戶體驗(yàn),一個(gè)占位圖也是非常重要的
Glide.with(this)
? ? .load(url)
? ? .placeholder(R.drawable.loading)
? ? .error(R.drawable.error)
? ? .into(imageView);
5知残、動(dòng)圖
asBitmap()去加載gif圖片靠瞎,那么只會(huì)顯示靜態(tài)圖片,并且只顯示動(dòng)圖的第一幀?
.asGif()去加載靜態(tài)圖片會(huì)顯示錯(cuò)誤圖片求妹,報(bào)錯(cuò)乏盐。
Glide.with(this)
? ? .load(url)
? ? .asBitmap()
? ? .placeholder(R.drawable.loading)
? ? .error(R.drawable.error)
? ? .diskCacheStrategy(DiskCacheStrategy.NONE)
? ? .into(imageView);
6、Glide 使用加載動(dòng)畫(huà)和禁止動(dòng)畫(huà)
glide默認(rèn)有淡入淡出動(dòng)畫(huà).crossFade()也可以不加制恍,也有重載.crossFade(int duration),主要設(shè)置動(dòng)畫(huà)進(jìn)行快慢父能,默認(rèn)是300毫秒。
Glide
? ? .with(context)
? ? .load(UsageExampleListViewAdapter.eatFoodyImages[0])
? ? .placeholder(R.mipmap.ic_launcher)
? ? .error(R.mipmap.future_studio_launcher)
? ? .crossFade()
? ? .into(imageViewFade);
7净神、設(shè)置圖片大泻瘟摺;
.override(300, 200);? //設(shè)置加載圖片尺寸大小
8鹃唯、圖片請(qǐng)求的優(yōu)先級(jí)
Glide可以通過(guò)Priority枚舉來(lái)設(shè)置加載圖片的優(yōu)先級(jí),具體使用場(chǎng)景就是爱榕,我們點(diǎn)擊一個(gè)頁(yè)面時(shí),先加載頁(yè)面中重要的圖片坡慌,再加載那些子圖像
Priority (優(yōu)先級(jí))枚舉給了四個(gè)不同的選項(xiàng)黔酥,下面是按照遞增priority(優(yōu)先級(jí))的
Priority.LOW 最低
Priority.NORMAL 正常
Priority.HIGH 最高
Priority.IMMEDIATE 立即
注意:優(yōu)先級(jí)并不是完全嚴(yán)格遵守的。Glide 將會(huì)用他們作為一個(gè)準(zhǔn)則,并盡可能的處理這些請(qǐng)求跪者,但是它不能保證所有的圖片都會(huì)按照所要求的順序加載棵帽。
.priority(Priority.HIGH);
9、縮略圖
縮略圖不同于前面提到的占位圖坑夯。占位圖應(yīng)當(dāng)是跟app綁定在一起的資源岖寞。縮略圖是一個(gè)動(dòng)態(tài)的占位圖柜蜈,可以從網(wǎng)絡(luò)加載仗谆。縮略圖也會(huì)被先加載淑履,直到實(shí)際圖片請(qǐng)求加載完畢隶垮。如果因?yàn)槟承┰颍s略圖獲得的時(shí)間晚于原始圖片秘噪,它并不會(huì)替代原始圖片狸吞,而是簡(jiǎn)單地被忽略掉。具體的應(yīng)用場(chǎng)景有很多指煎,可以提供幾張圖片便于大家理解
圖中的1蹋偏,2,3至壤,4威始,5,6就是縮略圖像街,7黎棠,就是原圖;這樣大家應(yīng)該會(huì)理解一點(diǎn)了镰绎,我覺(jué)得吧(這里只是說(shuō)一下自己的觀點(diǎn))縮略圖一是用戶體驗(yàn)較好脓斩,從用戶的角度,我們已經(jīng)看見(jiàn)了一個(gè)小版本的圖片畴栖。點(diǎn)擊才會(huì)加載同樣的圖片(高分辨率)随静,二是省流量,一張?jiān)瓐D或許需要幾M但是一張縮略圖或許只需要幾K吗讶,
那怎么加載縮略圖呢挪挤?Glide提供了2個(gè)不同的方法產(chǎn)生縮略圖。
第一種关翎,是通過(guò)在加載的時(shí)候指定一個(gè)小的分辨率,產(chǎn)生一個(gè)縮略圖鸠信。
.thumbnail( 0.1f )里面的參數(shù)是一個(gè)浮點(diǎn)乘法運(yùn)算
這個(gè)方法是啥意思呢纵寝?
例如,傳遞一個(gè)0.1f作為參數(shù),Glide會(huì)加載原始圖片大小的10%的圖片爽茴。
原始圖片---->1000x1000像素葬凳,
則縮略圖---->100x100像素。
由于圖片將會(huì)比ImageView小室奏,你需要確被鹧妫縮放類型是否正確。
注意:你所有的請(qǐng)求設(shè)置都會(huì)影響到你的縮略圖胧沫。例如昌简,如果你使用了一個(gè)變換讓你的圖片變?yōu)榛叶葓D,縮略圖也同樣將會(huì)是灰度圖绒怨。
10纯赎、緩存
?我們都知道Glide是自帶緩存的,所有的圖片請(qǐng)求都會(huì)被緩存在內(nèi)存和磁盤上南蹂。大多數(shù)情況下犬金,緩存是一個(gè)非常有用的東西,但在一些特殊的情況下并不是很明智六剥。比如晚顷,如果你有一張不段變化的圖片,但是都是用的同一個(gè)URL疗疟,這時(shí)候就需要我們避免緩存该默,Glide提供了一些方法避免內(nèi)存存儲(chǔ)和磁盤存儲(chǔ);
禁止內(nèi)存存儲(chǔ):
.skipMemoryCache( true )
去特意告訴Glide跳過(guò)內(nèi)存緩存秃嗜,這個(gè)只影響內(nèi)存緩存权均!Glide為了避免以后的網(wǎng)絡(luò)請(qǐng)求,仍然會(huì)緩存到磁盤锅锨。
禁止磁盤存儲(chǔ):
如果你想要禁止請(qǐng)求的磁盤緩存叽赊,使用枚舉型變量DiskCacheStrategy.NONE作為參數(shù)。
.diskCacheStrategy( DiskCacheStrategy.NONE )
.diskCacheStrategy()中枚舉參數(shù)以及意義:
DiskCacheStrategy.NONE 啥也不緩存
DiskCacheStrategy.SOURCE 只緩存全尺寸圖.
DiskCacheStrategy.RESULT 只緩存最終降低分辨后用到的圖片
DiskCacheStrategy.ALL 緩存所有類型的圖片 (默認(rèn))
結(jié)合兩個(gè)方法就可以同時(shí)禁止內(nèi)存存儲(chǔ)和磁盤緩存了
上面是我對(duì)Glide的簡(jiǎn)單理解必搞,希望可以幫助到大家