Picasso 是什么
官方介紹:A powerful image downloading and caching library for Android. 簡單來說就是針對安卓平臺的一個非常牛逼的圖片加載庫。
官網地址
Picasso 使用
顯示網絡圖片到ImageView上
極致簡單
布局文件中聲明ImageView控件
<ImageView
android:id="@+id/iv_img"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"/>
代碼中加載圖片(添加網絡權限)
Picasso.with(context).load("http://192.168.X.XXX:8080/http/girl.jpg").into(imageView);
此時運行,如果網絡正常應該就能看到顯示出來的圖片了
添加加載過渡圖片
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.into(imageView);
在加載完成前會先展示占位圖片
加載失敗顯示圖片
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
加載失敗顯示設置的錯誤圖片
改變圖片大小
兩張照片,大小分別設置為[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 方法需要注意必須通過引用方式,如果直接指定大小會出錯
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()同時使用
圖片旋轉
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 去掉內存緩存
- MemoryPolicy.NO_STORE 去掉硬盤緩存
圖片轉換
transform()
需要自己實現,完成對圖片的二次處理
比如需要顯示為圓形頭像:
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);
開啟指示器
通過開啟指示器,顯示這個圖片是從內存加載來的還是從SD卡加載來的還是從網絡加載來的。開啟后會在圖片左上角顯示一個三角形圖案。
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);
有三種顏色
- 紅 網絡
- 藍 SD卡
- 綠 內存
添加監聽器
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() {
}
});
停止加載、恢復加載
在列表滑動時可以停止加載,列表滑動結束恢復加載
Object tag = new Object();
Picasso picasso = Picasso.with(this);
picasso.pauseTag(tag);//暫停加載
picasso.resumeTag(tag);//回復加載
取消加載
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);//取消加載
如果沒有取消顯示正常加載圖片,如果加上取消下載代碼,則顯示錯誤圖片
Picasso 緩存簡單分析
Picasso 內部訪問網絡,下載圖片使用 createDefaultDownloader()方法來創建下載器,默認使用okhttp,如果當前項目沒有找到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沒有指定緩存文件地址的接口,所以下載到本地的緩存文件地址默認是okhttp等的配置。
源代碼:
static File createDefaultCacheDir(Context context) {
File cache = new File(context.getApplicationContext().getCacheDir(), "picasso-cache");
if(!cache.exists()) {
cache.mkdirs();
}
return cache;
}
可以看到是默認保存在內部緩存中,去相應目錄下查找可以看到兩個文件,分別以.0和.1結尾。
其中以.0結尾的文件是網絡通信信息,可以改后綴名為.txt查看,以.1結尾的文件就是下載緩存的圖片信息,可以更改后綴名為.jpg或.png查看。
那么如果想要更改下載文件的緩存地址呢?需要自己定義一個下載器:
Picasso picasso = new Picasso.Builder(this)
.downloader(new OkHttp3Downloader(this.getExternalCacheDir()))
.build();
這個下載器可以直接使用大神JakeWharton寫的:picasso2-okhttp3-downloader
初步使用總結至此,不定期更新~~~
歡迎訪問 博客 查看更多文章。