一、Android平臺(tái)圖片加載庫(kù)現(xiàn)狀
目前社區(qū)主流的圖片加載庫(kù)有Universal Image Loader,Picasso,Volley,Fresco,Glide.
Picasso是Square公司開(kāi)源的一個(gè)Android圖形緩存庫(kù),Picasso實(shí)現(xiàn)了圖片的異步加載,并解決了Android中加載圖片時(shí)常見(jiàn)的一些問(wèn)題,它有以下特點(diǎn):
·在Adapter中取消了不在視圖范圍內(nèi)的ImageView的資源加載,因?yàn)榭赡軙?huì)產(chǎn)生圖片錯(cuò)位;
·使用復(fù)雜的圖片轉(zhuǎn)換技術(shù)降低內(nèi)存的使用
·自帶內(nèi)存和硬盤(pán)的二級(jí)緩存機(jī)制
Android系統(tǒng)作為圖片資源加載的主角,它是通過(guò)圖像的像素點(diǎn)來(lái)把圖像加載到內(nèi)存中的;現(xiàn)在一張500W的攝像頭拍出的照片(2592x1936),加載到內(nèi)存中需要大約19M的內(nèi)存;如果你加入了信號(hào)強(qiáng)度不一的網(wǎng)絡(luò)中進(jìn)行了復(fù)雜的網(wǎng)絡(luò)請(qǐng)求,并進(jìn)行圖片的緩存與其他處理,你會(huì)耗費(fèi)大量的時(shí)間與精力來(lái)處理這些問(wèn)題,但如果用了Picasso, 這些問(wèn)題都一消而散;
1.絕對(duì)是最輕量的圖片加載庫(kù),120kb.
2.自帶監(jiān)控功能,可以檢測(cè)cache hit/內(nèi)存大小等等數(shù)據(jù)
3.圖片預(yù)加載
4.線程并發(fā)數(shù)依網(wǎng)絡(luò)狀態(tài)變化而變化、優(yōu)先級(jí)調(diào)度
5.圖片變換
6.圖片壓縮、自適應(yīng)
7.易擴(kuò)展
Picasso實(shí)現(xiàn)了圖片的異步加載,并解決了Android中加載圖片時(shí)常見(jiàn)的一些問(wèn)題,它有以下特點(diǎn):
·在Adapter中取消了不在視圖范圍內(nèi)的ImageView的資源加載,因?yàn)榭赡軙?huì)產(chǎn)生圖片錯(cuò)位;
·使用復(fù)雜的圖片轉(zhuǎn)換技術(shù)降低內(nèi)存的使用
·自帶內(nèi)存和硬盤(pán)的二級(jí)緩存機(jī)制
目前Picasso的最新版本是2.5.2,你可以下載對(duì)應(yīng)的Jar包,將Jar包添加到你的項(xiàng)目中,或者在build.gradle配置文件中加入
compile'com.squareup.picasso:picasso:2.5.2'
注意如果你開(kāi)啟了混淆,你需要將以下代碼添加到混淆規(guī)則文件中:
-dontwarncom.squareup.okhttp.**
·加載一張網(wǎng)絡(luò)圖片到ImageView上
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);//此種策略并不會(huì)壓縮圖片
·預(yù)加載一張圖片
Picasso.with(this).load(URL).fetch();
Picasso.with(this).load(URL).fetch(Callback);
注意哦,如果你以以下面這種方式加上圖形變換preload的話:
Picasso.with(this).load(URL).rotate(20).fetch();
再下面這種方式是取不到preload的圖片的,因?yàn)轭A(yù)緩存的是經(jīng)過(guò)變換后的圖片,它的cachekey會(huì)有rotation標(biāo)識(shí)
Picasso.with(this).load(URL).into(imageView);
當(dāng)然我說(shuō)的是preload到內(nèi)存中的那份經(jīng)過(guò)旋轉(zhuǎn)的圖片,http會(huì)緩存旋轉(zhuǎn)前的圖片到磁盤(pán)(支持緩存的情況下),所以最終還是可以從磁盤(pán)緩存
拿到圖片的。
·替換默認(rèn)的Picasso
Picasso p = new Picasso.Builder(this).executor().downloader(downloader).memoryCache(cache).build();
Picasso.setSingletonInstance(p);
·同步call
newAsyncTask(){
@Override
protectedBitmap doInBackground(Void...params) {
try{
returnPicasso.with(PicassoTestActivity.this).load(URL).get();
}catch(IOException e) {
e.printStackTrace();
}
returnnull;
}
@Override
protectedvoidonPostExecute(Bitmap bitmap) {
if(bitmap !=null){
imageView.setImageBitmap(bitmap);
}
}
}.execute();
注意,必須在異步線程調(diào)用,否則crash,另外,這個(gè)結(jié)果并不會(huì)緩存到內(nèi)存里面,所以慎用。
·自適應(yīng)
Picasso.with(TestImageActivity.this).load(url).fit().into(imageview);
fit方法的意思是,讓圖片的寬高恰好等于imageView的寬高.前提是你的imageView控件不能設(shè)置成wrap_content,也就是必須
有大小才行。另外,如果使用了fit方法,那么就不能調(diào)用resize.
·壓縮到指定尺寸
Picasso.with(TestImageActivity.this).load(url).resize(widthPixel,heightPixel).centerInside().into(imageView);
Picasso.with(TestImageActivity.this).load(URL).resizeDimen(R.dimen.width,R.dimen.height).centerCrop().into(iv);
resize后面通常接centerInside或者centerCrop。注意這跟ImageView的scaleTyoe沒(méi)有關(guān)系,僅僅指的是圖片的縮放方式。
比如如下代碼,iv不壓縮,iv_2寬高壓縮到40dp并且指定為centerInside.
·圖形變換
Picasso.with(TestImageActivity.this).load(URL).rotate(20).into(iv);//自定義變換
Picasso.with(TestImageActivity.this).load(URL).transform(new Transformation() {
@Override
public Bitmap transform(Bitmapsource) {//從原圖中間裁剪一個(gè)正方形
intsize= Math.min(source.getWidth(),source.getHeight());
intx = (source.getWidth() -size) /2;
inty = (source.getHeight() -size) /2;
Bitmap result = Bitmap.createBitmap(source, x, y,size,size);
if(result !=source) {
source.recycle();
}
returnresult;
}
@Override
public String key() {
return"square()";
}
}).into(iv);
Android Glide使用的詳解:http://blog.csdn.NET/u014712086/article/details/71606751