1. 程式人生 > >android-------非常好的圖片載入框架和快取庫(Picasso)

android-------非常好的圖片載入框架和快取庫(Picasso)

Picasso是Square公司開源的一個Android圖形快取庫, 可以實現圖片載入(本地和網路)和快取功能。

Paicsso可以實現圖片的很多功能,drawable/mipmap下圖片載入,SD卡圖片載入,網路圖片載入(可自己設定是否快取),圖片裁剪等。

Picasso實現了圖片的非同步載入,並解決了Android中載入圖片時常見的一些問題,它有以下特點:

  1. 在Adapter中取消了不在檢視範圍內的ImageView的資源載入,因為可能會產生圖片錯位;
  2. 使用複雜的圖片轉換技術降低記憶體的使用
  3. 自帶記憶體和硬碟的二級快取機制

效果如圖:


1:載入本地圖片

 int resourceId = R.mipmap.ic_launcher;
 Picasso.with(this).load(resourceId).into(iv1);

2:載入SD卡圖片
 File file = new File(path2);
 Picasso.with(this).load(file).into(iv2);

3:普通載入網路圖片
Picasso.with(this).load("http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg").into(iv3);

4:載入圖片並裁剪

Picasso.with( this).load("url").resize(99,99).centerInside().into(iv4);

5:初始化圖片和錯誤時的圖片

 Picasso.with(this).load("url")
                   .placeholder(R.mipmap.ic_launcher)//預設顯示圖片
                   .error(R.mipmap.ic_launcher)//載入時出現錯誤顯示的圖片
                   .into(iv5);

6:載入圖片過大要放棄快取( Picasso預設會使用裝置的15%的記憶體作為記憶體圖片快取,且現有的api無法清空記憶體快取。我們可以在檢視大圖時放棄使用記憶體快取,圖片從網路下載完成後會快取到磁碟中,載入會從磁碟中載入,這樣可以加速記憶體的回收
Picasso.with(this).load("url")//檢視大圖放棄快取,加速記憶體的回收
                  .memoryPolicy(NO_CACHE, NO_STORE)
                  .into(iv6);

7:  計算出最佳的大小及最佳的圖片質量來進行圖片展示 (  減少記憶體 )
Picasso.with(this).load("http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg")
                   .fit()
                   .into(img8);

8:自定義圖片控制元件載入
   /**
          *  重寫ImageView的onDetachedFromWindow方法,在它從螢幕中消失時回撥,去掉drawable引用,能加快記憶體的回收。
          *  priority()設定圖片載入的優先順序
          * 如果一個螢幕上頂部圖片較大,而底部圖片較小,因為Picasso是非同步載入,所以小圖會先加載出來,但是對於使用者來說,更希望看到的是上面的圖片先載入,
          * 底部的圖片後加載,Picasso支援設定優先順序,分為HIGH, MEDIUM, 和 LOW,所有的載入預設優先順序為MEDIUM;
          */
Picasso.with(this).load("http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg")
                  .priority(HIGH)
                  .into(recyclerImageView);


9:列表載入(.tag的使用)
 Picasso.with(context).load("url"])
                      .tag("RecyclerView") //引數為 Object
                      .into(viewHolder.imageView);

補充:
//因為圖片的旋轉都是相對(0,0)進行操作,所以如果我們想自定義相對於某個點,也是可以的,只需要呼叫
//.rotate(float degrees, float pivotX, float pivotY)

 Picasso.with(context).load("url").rotate(90f) //旋轉90度
                .into(imageViewSimpleRotate);

新程序中檢視大圖

列表頁的記憶體已經非常穩定,但是檢視大圖時,大圖往往佔用了20+m記憶體,加上現有程序中的記憶體,非常容易oom,在新程序中開啟Activity成為比較取巧的避免oom的方式。

<activity android:name=".DetailActivity" android:process=":picture"/>


新增程式所需要的依賴:
compile 'com.squareup.picasso:picasso:2.5.2'
AndroidManifest.xml新增許可權
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


其他網路圖片載入方式,請看

        Android之Glide(非常好用的圖片載入框架)