導(dǎo)入
- 我們每開發(fā)一個APP,基本都是顯示文字與展示圖片,圖片加載肯定不需要大家自己封裝,市場流行的圖片加載框架有Glide、Picasso、Fresco,每個框架都很優(yōu)秀,但是合不合腳只有我們自己知道,我比較喜歡用Glide。我們今天課程的主要內(nèi)容是glide的學(xué)習(xí),課程結(jié)束后大家會掌握隨意處理圖片了,比如模糊、圓角、黑白、大小等。
一.簡介
Glide(讀音糾正),一個被google所推薦的圖片加載庫,作者是bumptech。這個庫被廣泛運(yùn)用在google的開源項目中,包括2014年的google I/O大會上發(fā)布的官方app。(PS:眾所周知的簡介就到此為止了)
Glide 對于 Android SDK 的最低要求是 API level 10
Glide滑行的意思,可以看出這個庫的主旨就在于讓圖片加載變的流暢?,F(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)選項)。
//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