android-------非常好的圖片加載框架和緩存庫(Picasso)


Picasso是Square公司開源的一個Android圖形緩存庫, 可以實現圖片加載(本地和網絡)和緩存功能。

地址:http://square.github.io/picasso/

jar包下載: Picasso.jar

 

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之網絡圖片加載的5種模式

Android之網絡圖片框架UniversalImageLoader和結合LruCache緩存圖片

Android之Fresco(facebook的強大Android圖片加載的框架)

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM