picasso的使用
1)加載一張圖片
Picasso.with(this).load("url").placeholder(R.mipmap.ic_default).into(imageView);
2)加載一張圖片并設置一個回調接口
Picasso.with(this).load("url").placeholder(R.mipmap.ic_default).into(imageView, new Callback() {
});
3)預加載一張圖片
Picasso.with(this).load("url").fetch();
4)同步加載一張圖片,注意只能在子線程中調用并且Bitmap不會被緩存到內存里.
new Thread() {
@Override
public void run() {
try {
final Bitmap bitmap = Picasso.with(getApplicationContext()).load("url").get();
mHandler.post(new Runnable() {
@Override
public void run() {
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
5)加載一張圖片并自適應imageView的大小,如果imageView設置了wrap_content,會顯示不出來.直到該ImageView的LayoutParams被設置而且調用了該View的ViewTreeObserver.OnPreDrawListener回調接口后才會顯示.
Picasso.with(this).load("url").priority(Picasso.Priority.HIGH).fit().into(imageView);
6)加載一張圖片并按照指定尺寸以centerCrop()的形式縮放.
Picasso.with(this).load("url").resize(400,400).centerCrop().into(imageView);
7)加載一張圖片并按照指定尺寸以centerInside()的形式縮放.并設置加載的優先級為高.注意centerInside()或centerCrop()
8)只能同時使用一種,而且必須指定resize()或者resizeDimen();
Picasso.with(this).load("url").resize(100,100).centerInside().priority(Picasso.Priority.HIGH).into(imageView);
//加載一張圖片旋轉并且添加一個Transformation,可以對圖片進行各種變化處理,例如圓形頭像.
Picasso.with(this).load("url").rotate(10).transform(new Transformation() {
@Override
public Bitmap transform(Bitmap source) {
return null;
}
}).into(imageView);
9)加載一張圖片并設置tag,可以通過tag來暫定或者繼續加載,可以用于當ListView滾動是暫定加載.停止滾動恢復加載.
Picasso.with(this).load("url").tag(mContext).into(imageView);
Picasso.with(this).pauseTag(mContext);
Picasso.with(this).resumeTag(mContxt);
.類關系圖(從https://skykai521.github.io/2016/02/25/Picasso%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/ 復制過來的這篇文章寫的很詳細)
1>>Picasso.with()維護一個Picasso的單例,如果還未實例化就通過new Builder(context).build()創建一個singleton并返回
2>>使用Picasso默認配置的時候(當然也可以自定義),最后會調用build()方法并配置好我們需要的各種對象,最后實例化一個Picasso對象并返回。最后在Picasso的構造方法里除了對這些對象的賦值以及創建一些新的對象,例如清理線程等等.最重要的是初始化了requestHandlers
3>>添加自定義的extraRequestHandlers,另外添加了7個RequestHandler分別用來處理加載不同來源的資源,可能是Resource里的,也可能是File也可能是來源于網絡的資源.這里使用了一個ArrayList來存放這些RequestHandler
4>>Picasso的load()方法里我們可以傳入String,Uri或者File對象,但是其最終都是返回一個RequestCreator對象
5>>RequestCreator構造持有一個Picasso的對象,然后構建一個Request的Builder對象,將我們需要加載的圖片的信息都保存在data里,在我們通過.centerCrop()或者.transform()等等方法的時候實際上也就是改變data內的對應的變量標識,再到處理的階段根據這些參數來進行對應的操作
6>>into()創建了一個ImageViewAction對象并通過picasso提交,這里簡要說明一下ImageViewAction,實際上Picasso會根據我們調用的不同方式來實例化不同的Action對象,當我們需要往ImageView里加載圖片的時候會創建ImageViewAction對象,如果是往實現了Target接口的對象里加載圖片是則會創建TargetAction對象,這些Action類的實現類不僅保存了這次加載需要的所有信息,還提供了加載完成后的回調方法.也是由子類實現并用來完成不同的調用的。
7>>picasso.enqueueAndSubmit(action)------->dispatcher.dispatchSubmit(action)
------>通過一個handler對象發送了一個REQUEST_SUBMIT的消息----->Dispatcher的構造方法(省略了部分代碼),可以看到先是創建了一個HandlerThread對象,然后創建了一個DispatcherHandler對象,這個handler就是剛剛用來發送REQUEST_SUBMIT消息的handler,這里我們就明白了原來是通過Dispatcher類里的一個子線程里的handler不斷的派發我們的消息,這里是用來派發我們的REQUEST_SUBMIT消息,而且最終是調用了 dispatcher.performSubmit(action);