導(dǎo)入
- 我們每開發(fā)一個APP凰狞,基本都是顯示文字與展示圖片,圖片加載肯定不需要大家自己封裝沛慢,市場流行的圖片加載框架有Glide赡若、Picasso、Fresco团甲,每個框架都很優(yōu)秀逾冬,但是合不合腳只有我們自己知道,我比較喜歡用Glide伐庭。我們今天課程的主要內(nèi)容是glide的學(xué)習(xí)粉渠,課程結(jié)束后大家會掌握隨意處理圖片了,比如模糊圾另、圓角霸株、黑白、大小等集乔。
一.簡介
Glide(讀音糾正)去件,一個被google所推薦的圖片加載庫坡椒,作者是bumptech。這個庫被廣泛運(yùn)用在google的開源項(xiàng)目中尤溜,包括2014年的google I/O大會上發(fā)布的官方app倔叼。(PS:眾所周知的簡介就到此為止了)
Glide 對于 Android SDK 的最低要求是 API level 10
Glide滑行的意思,可以看出這個庫的主旨就在于讓圖片加載變的流暢」常現(xiàn)在被廣泛使用丈攒,當(dāng)然還是有很多開發(fā)者使用Square公司的picasso.
二.使用
添加依賴:
implementation 'com.github.bumptech.glide:glide:3.8.0'
添加網(wǎng)絡(luò)權(quán)限:
<uses-permission android:name="android.permission.INTERNET"/>
1、加載圖片到imageView
Glide.with(Context context).load(Strint url).into(ImageView imageView);
2授霸、各種形式的圖片加載到ImageView
// 加載本地圖片
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對象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
3巡验、加載帶有占位圖
Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);
占位圖目的為在目的圖片還未加載出來的時候,提前展示給用戶的一張圖片碘耳;
4显设、加載失敗 放置占位符
Glide.with(this).load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)//關(guān)閉Glide的硬盤緩存機(jī)制
.into(imageView);
//DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容。
//DiskCacheStrategy.SOURCE: 表示只緩存原始圖片辛辨。
//DiskCacheStrategy.RESULT: 表示只緩存轉(zhuǎn)換過后的圖片(默認(rèn)選項(xiàng))捕捂。
//DiskCacheStrategy.ALL : 表示既緩存原始圖片,也緩存轉(zhuǎn)換過后的圖片斗搞。
5指攒、加載指定格式的圖片--指定為靜止圖片
Glide.with(this)
.load(url)
.asBitmap()//只加載靜態(tài)圖片,如果是gif圖片則只加載第一幀榜旦。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
6幽七、加載動態(tài)圖片
Glide.with(this)
.load(url)
.asGif()//加載動態(tài)圖片景殷,若現(xiàn)有圖片為非gif圖片溅呢,則直接加載錯誤占位圖。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
7猿挚、加載指定大小的圖片
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)//指定圖片大小
.into(imageView);
8咐旧、關(guān)閉框架的內(nèi)存緩存機(jī)制
Glide.with(this)
.load(url)
.skipMemoryCache(true) //傳入?yún)?shù)為true時,則關(guān)閉內(nèi)存緩存绩蜻。
.into(imageView);
9铣墨、利用Glide將圖片加載到不同控件或加載成不同使用方式
//1、通過自己構(gòu)造 target 可以獲取到圖片實(shí)例
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
imageView.setImageDrawable(resource);
}
};
//2办绝、將圖片實(shí)例記載到指定的imageview上伊约,也可以做其他的事情
public void loadImage(View view) {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.into(simpleTarget);
}
10、Glide 實(shí)現(xiàn)預(yù)加載
希望提前對圖片進(jìn)行一個預(yù)加載孕蝉,等真正需要加載圖片的時候就直接從緩存中讀取屡律,不想再等待慢長的網(wǎng)絡(luò)加載時間
//a、預(yù)加載代碼
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
//preload() 有兩種重載
// 1降淮、帶有參數(shù)的重載,參數(shù)作用是設(shè)置預(yù)加載的圖片大谐瘛;
//2、不帶參數(shù)的表示加載的圖片為原始尺寸霍殴;
//b媒惕、使用預(yù)加載的圖片
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
切記:diskCacheStrategy() 方法內(nèi)必須設(shè)置參數(shù)為:“ DiskCacheStrategy.SOURCE ”,否則可能預(yù)加載失敗来庭,導(dǎo)致顯示圖片時妒蔚,需要重新加載。
11月弛、Glide 實(shí)現(xiàn)圖片下載
使用 downloadOnly(int width, int height) 或 downloadOnly(Y target) 方法替代 into(view) 方法面睛。
private void downImageByGlide() {
new Thread(new Runnable() {
@Override
public void run() {
final FutureTarget<File> fileFutureTarget = Glide.with(MainActivity.this)
.load(Constant.imageUrl)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
try {
final String path = fileFutureTarget.get().getPath();
runOnUiThread(new Runnable() {
@Override
public void run() {
Glide.with(MainActivity.this)
.load(new File(path))
.into(imageview);
}
});
Log.e("TAG", "path" + path);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
(1)、有兩個參數(shù)的 downloadOnly(int width, int height)
方法表示指定下載尺寸尊搬,用于在子線程內(nèi)進(jìn)行下載叁鉴;
(2)、target.get()
方法可以獲取到下載文件保存路徑,如果未下載ok,方法就會阻塞住佛寿,一直等到圖片下載完成才會有值返回幌墓;
注意: diskCacheStrategy() 方法的參數(shù)應(yīng)該為 DiskCacheStrategy.SOURCE 或者 DiskCacheStrategy.ALL否則可能導(dǎo)致加載圖片到控件的時候,需要重新加載冀泻。
12、監(jiān)聽 Glide 加載的狀態(tài)--它可以用來監(jiān)聽Glide加載圖片的狀態(tài)
public void loadImage(View view) {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target,
boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.into(imageView);
}
(1)弹渔、onException()
方法表示加載失敗胳施,onResourceReady()
表示加載成功;
(2)肢专、 每個方法都有一個 boolean 的返回值舞肆,false表示未處理、true 表示處理博杖。
13椿胯、Glide 的圖形變換功能
(1)、禁用圖形變換功能
Glide.with(this)
.load(url)
.dontTransform()
.into(imageView);
這個方法時全局的剃根,導(dǎo)致其他地方的圖片也不可進(jìn)行圖形變換了哩盲。
修改方法
Glide.with(this)
.load(url)
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(imageView);
通過 override() 方法設(shè)置大小
(2)、簡單的圖形變換
Glide.with(this)
.load(url)
.centerCrop()
.into(imageView);
Glide.with(this)
.load(url)
.fitCenter()
.into(imageView);
-
centerCrop()
方法 :等比例縮放圖片狈醉,直到圖片的寬高都大于等于ImageView的寬度廉油,然后截取中間的顯示 -
fitCenter()
方法: 等比例縮放圖片,寬或者是高等于ImageView的寬或者是高
(3)苗傅、override()
方法與 centerCrop()
方法配合使用
String url = "http://cn.bing.com/az/hprichbg/rb/AvalancheCreek_ROW11173354624_1920x1080.jpg";
Glide.with(this)
.load(url)
.override(500, 500)
.centerCrop()
.into(imageView);
(4)抒线、復(fù)雜的圖像變換
首先需要再引入一個 第三方框架 。
dependencies {
implementation 'jp.wasabeef:glide-transformations:4.0.0'
// If you want to use the GPU Filters
implementation 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1'
}
部分樣例:
圖片虛化
Glide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this))
.into(imageView);
圖片黑白化
Glide.with(this)
.load(url)
.bitmapTransform(new GrayscaleTransformation(this))
.into(imageView);
多個屬性同時使用
Glide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
.into(imageView);
還有更多的好玩的屬性金吗,請到框架官網(wǎng)查看:https://github.com/wasabeef/glide-transformations