
開坑,想想一個(gè) ImageView 從看到控件到顯示完圖片會(huì)經(jīng)歷哪些過程?
1.顯示默認(rèn)圖片
即圖片在加載前顯示的樣子,有的 App 就會(huì)做到圖片上有個(gè)轉(zhuǎn)圈的動(dòng)畫效果、或者進(jìn)度條
2.顯示圖片
這是最基本的功能
3.網(wǎng)絡(luò)錯(cuò)誤顯示
在圖片地址錯(cuò)誤,或者網(wǎng)絡(luò)不好導(dǎo)致圖片加載失敗顯示的圖片
4.緩存圖片
圖片緩存節(jié)省流量避免多次加載
5.顯示壓縮圖片/原圖
有些原圖太大,實(shí)際并不需要顯示這么大分辨率的圖片,因此需要進(jìn)行壓縮
有些圖片則為了需要看清,即使很大也要顯示原圖或接近原圖效果
目前項(xiàng)目中我使用了 Picasso 來對(duì)圖片進(jìn)行處理,現(xiàn)在我打算使用 Glide 來解決以上的幾個(gè)問題,Glide 的使用方法在網(wǎng)上也都非常多,在這里給自己一個(gè)使用總結(jié)
Glide 一般使用方法:
Glide.with(context)
.load(url)
.placeholder(R.drawable.loading) //占位符,顯示默認(rèn)圖片
.error(R.drawable.error)//顯示加載錯(cuò)誤的圖片
.override(100,100)//自定義剪裁圖片大小
.into(imageView);
Picasso 一般使用方法:
Picasso.with(context)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.resize(100, 100)//自定義剪裁圖片大小
.centerCrop().into(img);
Glide 和 Picasso 的常用的方法和問題:
Glide 可以直接載入 GIF 動(dòng)畫,Picasso 不行。
Glide 占用的內(nèi)存比 Picasso 高。
Picasso 2.5.2 在加載比較大的圖片時(shí),會(huì)顯示空白。我在 vivo 手機(jī)上拍照返回就會(huì)出現(xiàn)這個(gè)問題,一張照片大概 4-5 M 左右。在 GitHub 上看到的解決辦法是使用 Picasso 2.4 版本。
Glide 可以使用 CenterCrop() 和 fitCenter() 來剪裁圖片;
Picasso 可以使用 fit() 方法來讓圖片的寬高自適應(yīng) imageView ,前提是你的 imageView 控件不能設(shè)置成 wrap_content 。如果使用了 fit 方法,那么就不能調(diào)用 resize。Glide 可以使用 .priority(Priority.HIGH) 方法來控制多個(gè)圖片加載的優(yōu)先度。
加載成功的回調(diào)
Picasso.with(this)
.load(url)
.into(iv, new Callback() {
@Override
public void onSuccess() {
Toast.makeText(MainActivity.this, "加載成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onError() {
Toast.makeText(MainActivity.this, "加載失敗", Toast.LENGTH_SHORT).show();
}
});
Glide.with(this)
.load(url)
.into(new GlideDrawableImageViewTarget(iv) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable>animation) {
super.onResourceReady(resource, animation);
Toast.makeText(MainActivity.this, "加載成功", Toast.LENGTH_SHORT).show();
}
}
);
- Glide 的 GlideDrawableImageViewTarget 里還有很多其他狀態(tài)的方法,一看便知其作用

- 獲取加載后的 Bitmap 圖片
Glide.with(this)
.load(file)
.asBitmap()//加載或使用有關(guān) Bitmap 圖片的時(shí)候需要加上
.into(new BitmapImageViewTarget(iv) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
super.onResourceReady(bitmap, anim);
iv.setImageBitmap(bitmap);
}
});
Picasso有兩種方法,.get() 和 Target
/**
* 注意 get() 方法不能再主線程使用,會(huì)拋出異常:
* java.lang.IllegalStateException: Method call should not happen from the main thread.
*/
Bitmap bitmap = Picasso.with(MainActivity.this)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.get();
//使用 Target 時(shí),最好不要使用匿名內(nèi)部類,因?yàn)?Picasso 可能在加載完成前就把 Bitmap 給回收了;
Picasso.with(this)
.load(file)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.into(target);
private com.squareup.picasso.Target target = new com.squareup.picasso.Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//加載成功后會(huì)得到一個(gè)bitmap,可以自定義操作
iv.setImageBitmap(bitmap);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
// 加載失敗進(jìn)行相應(yīng)處理
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
待續(xù)