簡(jiǎn)介
Glide is a fast and efficient open source media management and image loading framework for Android that wraps media decoding, memory and disk caching, and resource pooling into a simple and easy to use interface.
Glide是一款快速高效的Android開源媒體管理和圖像加載框架,它將媒體解碼,內(nèi)存和磁盤緩存以及資源池包裝成簡(jiǎn)單易用的界面。
中文參考文檔:https://muyangmin.github.io/glide-docs-cn/
配置
1.依賴
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
2.添加訪問網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
3創(chuàng)建一個(gè)實(shí)體類
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
}
錘一下后才能使用
使用
1.一般使用只加載圖片
Glide.with(Context context).load(Strint url).into(ImageView imageView);
2.加載圓形圖片
// .transform(new RoundedCorners(24))直接也可以
RequestOptions mRequestOptions = RequestOptions.circleCropTransform()//圓形方法
.skipMemoryCache(true);//不做內(nèi)存緩存
GlideApp.with(this)
.load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
.centerCrop()
.apply(mRequestOptions)
.placeholder(R.drawable.ic_launcher_background)//加載中顯示的圖片
.error(R.drawable.ic_launcher_foreground)// 錯(cuò)誤后顯示的圖片
.into(mImg);
3.加載圓角
//設(shè)置圖片圓角角度
RoundedCorners roundedCorners= new RoundedCorners(6);
//通過RequestOptions擴(kuò)展功能,override:采樣率,因?yàn)镮mageView就這么大,可以壓縮圖片,降低內(nèi)存消耗
RequestOptions options=RequestOptions.bitmapTransform(roundedCorners).override(300, 300);
GlideApp.with(this)
.load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
.apply(options)
.into(img);
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對(duì)象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
3、加載帶有占位圖
Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);
占位圖目的為在目的圖片還未加載出來的時(shí)候,提前展示給用戶的一張圖片;
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)圖片,如果是git圖片則只加載第一幀。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
6、加載動(dòng)態(tài)圖片
Glide.with(this)
.load(url)
.asGif()//加載動(dòng)態(tài)圖片,若現(xiàn)有圖片為非gif圖片,則直接加載錯(cuò)誤占位圖。
.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ù)為false時(shí),則關(guān)閉內(nèi)存緩存。
.into(imageView);
9、關(guān)閉硬盤的緩存
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE) //關(guān)閉硬盤緩存操作
.into(imageView);
//其他參數(shù)表示:
//DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容。
//DiskCacheStrategy.SOURCE: 表示只緩存原始圖片。
//DiskCacheStrategy.RESULT: 表示只緩存轉(zhuǎn)換過后的圖片(默認(rèn)選項(xiàng))。
//DiskCacheStrategy.ALL : 表示既緩存原始圖片,也緩存轉(zhuǎn)換過后的圖片。
10、當(dāng)引用的 url 存在 token 時(shí)解決方法-->重寫 Glide 的 GlideUrl 方法
public class MyGlideUrl extends GlideUrl {
private String mUrl;
public MyGlideUrl(String url) {
super(url);
mUrl = url;
}
@Override
public String getCacheKey() {
return mUrl.replace(findTokenParam(), "");
}
private String findTokenParam() {
String tokenParam = "";
int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
if (tokenKeyIndex != -1) {
int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
if (nextAndIndex != -1) {
tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
} else {
tokenParam = mUrl.substring(tokenKeyIndex);
}
}
return tokenParam;
}
}
然后加載圖片的方式為:
Glide.with(this)
.load(new MyGlideUrl(url))
.into(imageView);
11、利用Glide將圖片加載到不同控件或加載成不同使用方式
(1)、拿到圖片實(shí)例
//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);
}
(2)、將圖片加載到任何位置
/*
*將圖片加載為控件背景
*/
public class MyLayout extends LinearLayout {
private ViewTarget<MyLayout, GlideDrawable> viewTarget;
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
MyLayout myLayout = getView();
myLayout.setImageAsBackground(resource);
}
};
}
public ViewTarget<MyLayout, GlideDrawable> getTarget() {
return viewTarget;
}
public void setImageAsBackground(GlideDrawable resource) {
setBackground(resource);
}
}
//引用圖片到指定控件作為背景
public class MainActivity extends AppCompatActivity {
MyLayout myLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myLayout = (MyLayout) findViewById(R.id.background);
}
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(myLayout.getTarget());
}
}
12、Glide 實(shí)現(xiàn)預(yù)加載
//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)致顯示圖片時(shí),需要重新加載。
13、Glide 實(shí)現(xiàn)圖片下載
使用 downloadOnly(int width, int height) 或 downloadOnly(Y target) 方法替代 into(view) 方法。
public void downloadImage(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context)
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
final File imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
(1)、有兩個(gè)參數(shù)的 downloadOnly(int width, int height) 方法表示指定下載尺寸,用于在子線程內(nèi)進(jìn)行下載;
(2)、一個(gè)參數(shù)的 downloadOnly(Y target) 方法 在主線程內(nèi)進(jìn)行下載
(3)、target.get() 方法可以獲取到下載文件保存路徑;
使用下載完的圖片的方式
public void loadImage(View view) {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
}
注意: diskCacheStrategy() 方法的參數(shù)應(yīng)該為 DiskCacheStrategy.SOURCE 或者 DiskCacheStrategy.ALL否則可能導(dǎo)致加載圖片到控件的時(shí)候,需要重新加載。
13、監(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)、 每個(gè)方法都有一個(gè) boolean 的返回值,false表示未處理、true 表示處理。
圖片滑動(dòng)模糊化
/*
* 實(shí)現(xiàn)兩個(gè)圖片在滑動(dòng)過程中顯示透明,就是定義兩張相同的圖片重疊一下
* */
//這個(gè)是占位符
RequestOptions option=new RequestOptions().placeholder(R.mipmap.a);
Glide.with(getContext()).load(url).apply(option).into(img);
//這個(gè)是設(shè)置透明
RequestOptions options=new RequestOptions().transform(new BlurTransformation());
Glide.with(getContext()).load(url).apply(options).into(img_b);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
float rate = 1 + verticalOffset * 2.0f / SystemUtil.dp2px(258);
if (rate>0){
//260dp = 780px
//0到-780,偏移0:1.0f,偏移 -780:0
//透明度,0f-1.0f
//verticalOffset/ SystemUtil.dp2px(260),0到-1
img.setAlpha(rate);
}
}
});