Picasso 是什么
官方介紹:A powerful image downloading and caching library for Android. 簡(jiǎn)單來說就是針對(duì)安卓平臺(tái)的一個(gè)非常牛逼的圖片加載庫(kù)瘸味。
官網(wǎng)地址
Picasso 使用
顯示網(wǎng)絡(luò)圖片到ImageView上
極致簡(jiǎn)單
布局文件中聲明ImageView控件
<ImageView
android:id="@+id/iv_img"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"/>
代碼中加載圖片(添加網(wǎng)絡(luò)權(quán)限)
Picasso.with(context).load("http://192.168.X.XXX:8080/http/girl.jpg").into(imageView);
此時(shí)運(yùn)行,如果網(wǎng)絡(luò)正常應(yīng)該就能看到顯示出來的圖片了
添加加載過渡圖片
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.into(imageView);
在加載完成前會(huì)先展示占位圖片
加載失敗顯示圖片
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
加載失敗顯示設(shè)置的錯(cuò)誤圖片
改變圖片大小
兩張照片槐瑞,大小分別設(shè)置為[300,300]和[600,600]
- resize
- resizeDimen
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resize(300, 300)
.centerCrop()
.into(imageView);
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resize(600, 600)
.centerCrop()
.into(imageView2);
注:resize的單位為px,如果想要使用dp單位指定大小搭儒,使用另外的方法:resizeDimen
resizeDimen 方法需要注意必須通過引用方式惑淳,如果直接指定大小會(huì)出錯(cuò)
img[5]
正確使用方式:
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resizeDimen(R.dimen.img_width_150, R.dimen.img_height_150)
.centerCrop()
.into(imageView);
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resizeDimen(R.dimen.img_width_300, R.dimen.img_height_300)
.centerCrop()
.into(imageView2);
fit() 方法不能和resize()同時(shí)使用
圖片旋轉(zhuǎn)
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.rotate(90)
.into(imageView);
緩存策略
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE)
.into(imageView);
- MemoryPolicy.NO_CACHE 去掉內(nèi)存緩存
- MemoryPolicy.NO_STORE 去掉硬盤緩存
圖片轉(zhuǎn)換
transform()
需要自己實(shí)現(xiàn)咳蔚,完成對(duì)圖片的二次處理
比如需要顯示為圓形頭像:
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.transform(new Transformation() {
@Override
public Bitmap transform(Bitmap source) {
int width = source.getWidth();
int height = source.getHeight();
int size = Math.min(width, height);
Bitmap blankBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(blankBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawCircle(size / 2, size / 2, size / 2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
if (source != null && !source.isRecycled()) {
source.recycle();
}
return blankBitmap;
}
@Override
public String key() {
return "girl";
}
})
.into(imageView);
開啟指示器
通過開啟指示器刃滓,顯示這個(gè)圖片是從內(nèi)存加載來的還是從SD卡加載來的還是從網(wǎng)絡(luò)加載來的狂票。開啟后會(huì)在圖片左上角顯示一個(gè)三角形圖案。
Picasso picasso = Picasso.with(this);
picasso.setIndicatorsEnabled(true);
picasso
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
有三種顏色
- 紅 網(wǎng)絡(luò)
- 藍(lán) SD卡
- 綠 內(nèi)存
添加監(jiān)聽器
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
停止加載蚊锹、恢復(fù)加載
在列表滑動(dòng)時(shí)可以停止加載瞳筏,列表滑動(dòng)結(jié)束恢復(fù)加載
Object tag = new Object();
Picasso picasso = Picasso.with(this);
picasso.pauseTag(tag);//暫停加載
picasso.resumeTag(tag);//回復(fù)加載
取消加載
Picasso picasso = Picasso.with(this);
Picasso.with(this)
.load("http://192.168.9.232:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
picasso.cancelRequest(imageView);//取消加載
如果沒有取消顯示正常加載圖片,如果加上取消下載代碼枫耳,則顯示錯(cuò)誤圖片
Picasso 緩存簡(jiǎn)單分析
Picasso 內(nèi)部訪問網(wǎng)絡(luò)乏矾,下載圖片使用 createDefaultDownloader()方法來創(chuàng)建下載器孟抗,默認(rèn)使用okhttp,如果當(dāng)前項(xiàng)目沒有找到okhttp包迁杨,則使用HttpURlConnection.
源代碼:
static Downloader createDefaultDownloader(Context context) {
try {
Class.forName("com.squareup.okhttp.OkHttpClient");
return Utils.OkHttpLoaderCreator.create(context);
} catch (ClassNotFoundException var2) {
return new UrlConnectionDownloader(context);
}
}
Picasso沒有指定緩存文件地址的接口,所以下載到本地的緩存文件地址默認(rèn)是okhttp等的配置凄硼。
源代碼:
static File createDefaultCacheDir(Context context) {
File cache = new File(context.getApplicationContext().getCacheDir(), "picasso-cache");
if(!cache.exists()) {
cache.mkdirs();
}
return cache;
}
可以看到是默認(rèn)保存在內(nèi)部緩存中铅协,去相應(yīng)目錄下查找可以看到兩個(gè)文件,分別以.0和.1結(jié)尾摊沉。
其中以.0結(jié)尾的文件是網(wǎng)絡(luò)通信信息狐史,可以改后綴名為.txt查看,以.1結(jié)尾的文件就是下載緩存的圖片信息说墨,可以更改后綴名為.jpg或.png查看骏全。
那么如果想要更改下載文件的緩存地址呢?需要自己定義一個(gè)下載器:
Picasso picasso = new Picasso.Builder(this)
.downloader(new OkHttp3Downloader(this.getExternalCacheDir()))
.build();
這個(gè)下載器可以直接使用大神JakeWharton寫的:picasso2-okhttp3-downloader
初步使用總結(jié)至此尼斧,不定期更新~~~
歡迎訪問 博客 查看更多文章姜贡。