開坑秸仙,想想一個 ImageView 從看到控件到顯示完圖片會經(jīng)歷哪些過程桩盲?
1.顯示默認圖片
即圖片在加載前顯示的樣子,有的 App 就會做到圖片上有個轉(zhuǎn)圈的動畫效果捞蛋、或者進度條
2.顯示圖片
這是最基本的功能
3.網(wǎng)絡(luò)錯誤顯示
在圖片地址錯誤柬姚,或者網(wǎng)絡(luò)不好導(dǎo)致圖片加載失敗顯示的圖片
4.緩存圖片
圖片緩存節(jié)省流量避免多次加載
5.顯示壓縮圖片/原圖
有些原圖太大,實際并不需要顯示這么大分辨率的圖片搬设,因此需要進行壓縮
有些圖片則為了需要看清穴店,即使很大也要顯示原圖或接近原圖效果
目前項目中我使用了 Picasso 來對圖片進行處理泣洞,現(xiàn)在我打算使用 Glide 來解決以上的幾個問題默色,Glide 的使用方法在網(wǎng)上也都非常多,在這里給自己一個使用總結(jié)
Glide 一般使用方法:
Glide.with(context)
.load(url)
.placeholder(R.drawable.loading) //占位符腿宰,顯示默認圖片
.error(R.drawable.error)//顯示加載錯誤的圖片
.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 動畫,Picasso 不行义钉。
Glide 占用的內(nèi)存比 Picasso 高规肴。
Picasso 2.5.2 在加載比較大的圖片時夜畴,會顯示空白。我在 vivo 手機上拍照返回就會出現(xiàn)這個問題贪绘,一張照片大概 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) 方法來控制多個圖片加載的優(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 圖片的時候需要加上
.into(new BitmapImageViewTarget(iv) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
super.onResourceReady(bitmap, anim);
iv.setImageBitmap(bitmap);
}
});
Picasso有兩種方法贤斜,.get() 和 Target
/**
* 注意 get() 方法不能再主線程使用,會拋出異常:
* 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 時,最好不要使用匿名內(nèi)部類奴曙,因為 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) {
//加載成功后會得到一個bitmap,可以自定義操作
iv.setImageBitmap(bitmap);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
// 加載失敗進行相應(yīng)處理
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
待續(xù)