一渊抽、前言:
下一篇:Glide 基本封裝使用(二)http://www.reibang.com/p/61de90eb6d93
Glide是谷歌為我們推薦的一個(gè)圖片加載庫尾膊。為什么要選擇使用Glide呢欲逃?
- Glide 輕量級(jí);
- 速度快凡纳;
- 可以根據(jù)所需加載圖片的大小自動(dòng)適配所需分辨率的圖疏虫;
- 支持多種格式圖片(靜態(tài)webp,動(dòng)態(tài)gif特石,jpeg盅蝗,jpg,png)姆蘸;
- 支持多種數(shù)據(jù)源圖片(url墩莫,drawable芙委,src,file狂秦,asserts灌侣,raw)。
二裂问、使用:
1. 添加依賴:
implementation 'com.github.bumptech.glide:glide:4.5.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
2. 添加訪問網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
//它可以監(jiān)聽用戶的連接狀態(tài)并在用戶重新連接到網(wǎng)絡(luò)時(shí)重啟之前失敗的請(qǐng)求
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
//用于硬盤緩存和讀取
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3. Glide的常見用法:
- with() 提供了幾種構(gòu)造方法侧啼,可以在源碼里看,有Context, Activity, Fragment等,如果傳入Application.this作為參數(shù)時(shí),Glide的加載不受當(dāng)前Activity生命周期影響朋贬,但這會(huì)導(dǎo)致即使Activity結(jié)束后,仍然繼續(xù)加載圖片哪审。
- load() 對(duì)象: String(文件路徑,網(wǎng)絡(luò)地址)虑瀑,F(xiàn)ile(文件資源)湿滓,Integer(資源id)。
- asGif() 表示的gif動(dòng)畫缴川,加載GIF圖片茉稠,不加該方法時(shí),也可以加載GIF把夸;加了該方法而线,如果資源不是GIF,會(huì)加載失斄等铡膀篮;
- asBitmap:表示靜態(tài)圖,把圖片當(dāng)成bitmap對(duì)待岂膳,如果是Gif時(shí)會(huì)停留在第一幀 誓竿;
- diskCacheStrategy() 表示磁盤緩存策略。
1.DiskCacheStrategy.RESULT:展示小大的圖片緩存
2.DiskCacheStrategy.ALL; 展示在控件中大小圖片尺寸和原圖都會(huì)緩存
3.DiskCacheStrategy.NONE:不設(shè)置緩存
4.DiskCacheStrategy.SOURCE:原圖緩存 - override(int width, int height)
設(shè)置加載圖片的寬高谈截,像素為單位筷屡,在自定義ImageView大小或者計(jì)算瀑布流高度時(shí),偶爾會(huì)用到; - placeholder() 在加載過程中設(shè)置占位圖簸喂,可以傳入Drawable或resouceId ;
- error() 加載失敗顯示的圖片毙死,可以傳入Drawable或resouceId ;
- thumbnail() 縮略圖顯示傳入值(0-1f),設(shè)置縮略圖喻鳄,先加載縮略圖再加載完整圖片,在大量的圖片流列表里,這個(gè)方法還是挺好用的, 快速滑動(dòng)列表時(shí),不致于出現(xiàn)大量的空白扼倘, .thumbnail(0.1f) //縮略圖為原來的十分之一;
- crossFade() 顯示動(dòng)畫-淡入淡出
- transform() 設(shè)置圖片圓角或圓形顯示(繼承 BitmapTransformation)這都是很常用的哦
- centerCrop() 圖片顯示類型 fitCenter();
- into() into直接傳入ImageView;
- dontAnimate() Glide加載時(shí)默認(rèn)會(huì)有淡入淡出的加載效果除呵,該方法可以去掉動(dòng)畫效果再菊,直接顯示圖片 ;
- skipMemoryCache(true) 跳過圖片緩存 ;
- priority(Priority.NORMAL) 加載優(yōu)先級(jí)爪喘,優(yōu)先級(jí)越高越先加載 ;
- crossFade(int duration) 加載時(shí)淡入淡出動(dòng)畫時(shí)間纠拔,也可以不傳秉剑,默認(rèn)300ms ;
- animate() 自定義加載動(dòng)畫绿语;
- bitmapTransform() 對(duì)圖片進(jìn)行轉(zhuǎn)換秃症,只能用于bitmap ;
- transform() 對(duì)圖片進(jìn)行轉(zhuǎn)換 吕粹;
- Glide.get(this).clearDiskCache() 清理磁盤緩存,需要在子線程中執(zhí)行 岗仑;
- Glide.get(this).clearMemory(); 清理內(nèi)存緩存匹耕,可以直接在主線程執(zhí)行;
4. 加載圖片到imageView
Glide.with(Context context).load(Strint url).into(ImageView imageView);
5. 各種形式的圖片加載到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);
// 加載Url地址
String url = "http://img2.ph.126.net/OOEdWpTSE1Zi3ZUiwKUFFQ==/3374322020907845279.jpg";
Glide.with(this).load(url).into(imageView);
6. 加載帶有占位圖
Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);
占位圖目的為在目的圖片還未加載出來的時(shí)候荠雕,提前展示給用戶的一張圖片稳其;
7. 加載失敗 放置占位符
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)換過后的圖片盖文。
8. 加載指定格式的圖片--指定為靜止圖片
Glide.with(this)
.load(url)
.asBitmap()//只加載靜態(tài)圖片嘱蛋,如果是git圖片則只加載第一幀。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
9. 加載動(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);
10. 加載指定大小的圖片
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)//指定圖片大小
.into(imageView);
11. 關(guān)閉框架的內(nèi)存緩存機(jī)制
Glide.with(this)
.load(url)
.skipMemoryCache(true) //傳入?yún)?shù)為false時(shí)疙驾,則關(guān)閉內(nèi)存緩存凶伙。
.into(imageView);
12. 關(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)換過后的圖片扳肛。
13. 當(dāng)引用的 url 存在 token 時(shí)解決方法-->重寫 Glide 的 GlideUrl 方法
當(dāng) url 中存在用戶信息傻挂,可以重寫 Glide 中的方法進(jìn)行判斷。
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;
}
}
調(diào)用加載圖片的方式為:
Glide.with(this)
.load(new MyGlideUrl(url))
.into(imageView);
14. 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í),需要重新加載蛤育。
15. 利用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());
}
}
16. 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í)候挚歧,需要重新加載。
17. 監(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 表示處理耕餐。
18. Glide 的圖形變換功能
(1)凡傅、禁用圖形變換功能
Glide.with(this)
.load(url)
.dontTransform()
.into(imageView);
這個(gè)方法時(shí)全局的,導(dǎo)致其他地方的圖片也不可進(jìn)行圖形變換了肠缔。
(2)夏跷、修改方法,通過 override() 方法設(shè)置大小
Glide.with(this)
.load(url)
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(imageView);
(3)明未、簡(jiǎn)單的圖形變換
Glide.with(this)
.load(url)
.centerCrop()
.into(imageView);
Glide.with(this)
.load(url)
.fitCenter()
.into(imageView);
通過 centerCrop()方法 按照原始的長(zhǎng)寬比充滿全屏和 fitCenter() 方法 對(duì)原圖的中心區(qū)域進(jìn)行裁剪對(duì)圖片進(jìn)行相關(guān)設(shè)置槽华。
(4)、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);
三趟妥、總結(jié):
1.為什么會(huì)偶爾看到類似于"You cannot start a load for a destroyed activity"的異常呢?
當(dāng)你的圖片還在loaidng猫态, 或者你在asynctask里面的 post 里去 加載圖片,當(dāng)async 還在跑時(shí), 你back, finish 了你的activity亲雪,那么就報(bào)錯(cuò)了勇凭。所以請(qǐng)記住一句話: 不要再非主線程里面使用Glide加載圖片,如果真的使用了义辕,請(qǐng)把context參數(shù)換成getApplicationContext()虾标。這里是解決方案
2.另外Glide還提供了清除緩存的實(shí)現(xiàn)
- Glide.get(context).clearDiskCache();(清除磁盤緩存) 必須在子線程
- Glide.get(context).clearMemory();(清除內(nèi)存緩存) 必須在主線程
3.圓形圖片設(shè)置占位圖后第一次只顯示占位圖,第二次才正常顯示
這個(gè)問題比較多出現(xiàn)在用了自定義的圓形圖片控件或者CircleImageView之類的灌砖,解決方法如下:
(1)不設(shè)置占位圖
(2)使用Glide自帶的轉(zhuǎn)換來加載圓形圖片
Glide.with(this)
.load(url)
.asBitmap()
.centerCrop()
.override(300, 300)
.error(R.mipmap.delete)
.into(new BitmapImageViewTarget(imageView) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCircular(true);
imageView.setImageDrawable(circularBitmapDrawable);
}
});
(3) 使用bitmap加載到CircleImageView中
Glide.with(mContext)
.load(url)
.placeholder(R.drawable.loading_spinner)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
CircleImageView使用setImageBitmap(bitmap)
}
};
4. 設(shè)置了占位圖后璧函,第一次加載的圖片大小和占位圖一樣
比如我在XML里這么寫
<ImageView
android:id="@+id/normal_iv"
android:layout_width="150dp"
android:layout_height="200dp"
android:scaleType="fitCenter"/>
在Activity里這么寫
Glide.with(mContext)
.load(Constant.IMAGE_URL)
.placeholder(R.mipmap.ic_zhanwei)
.into(normalIv);
占位圖是一張正方形的圖,要加載的是一張寬圖基显,ScaleType用的是fitCenter,理論上講加載出來的圖片應(yīng)該是居中等比例顯示的蘸吓,就像這樣
但實(shí)際上第一次加載時(shí),是這樣
圖片被拉伸到和占位圖一樣的大小, 只有加載過一次后撩幽,圖片才能正常加載美澳。這種情況比較多出現(xiàn)在特定寬高或者動(dòng)態(tài)創(chuàng)建ImageView時(shí),設(shè)置的占位圖和實(shí)際加載的圖片或ScaleType比例不同,解決辦法是去除占位圖摸航,在ImageView中設(shè)置background當(dāng)占位圖。
5. 加載GIF特別慢或加載出錯(cuò)
偶爾需要加載GIF圖片時(shí)舅桩,會(huì)出現(xiàn)加載很慢的情況酱虎,可以加上diskCacheStrategy(DiskCacheStrategy.SOURCE),這樣可以很快加載出來擂涛。另外可以通過GlideDrawableImageViewTarget(ImageView view, int maxLoopCount)進(jìn)行循環(huán)次數(shù)的控制读串。
加載GIF一般會(huì)加上asGif的方法,不加也是可以加載的撒妈,但如果加上這個(gè)方法后恢暖,圖片卻不是GIF,會(huì)加載出錯(cuò)狰右。
參考作者:王元_Trump
鏈接:http://www.reibang.com/p/e78407a18716
參考作者:http://www.reibang.com/p/791ee473a89b
參考作者:小落zl
原文:https://blog.csdn.net/u014301370/article/details/71131533