1. 程式人生 > >Picasso開源圖片載入利器

Picasso開源圖片載入利器

英文官網地址:http://square.github.io/picasso/

在Android開發中,我們往往會需要遠端獲取圖片並且顯示在客戶端上面,從前我們都是使用HttpUrlConnection和AsyncTask這種原生的方式來完成,但是到了現在就不推薦這樣使用了,因為這樣會需要我們編寫大量程式碼,還需要處理快取和下載管理等。

Picasso:A Powerful Image Downloading and Caching Library for Android

Picasso(畢加索),外國人起名字還是很有意思的,根據名字我們基本可以知道它是跟圖片有關的框架

我們都知道,在主執行緒中是無法執行耗時操作的,所以需要AsyncTask,將耗時操作執行在後臺執行緒中。網路載入圖片也是一樣的,例如:

 public class MainActivity extends Activity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.image);
        String url = "http://www.jycoder.com/json/Image/1.jpg"
; // 執行Task new ImageDownloadTask(ivBasicImage).execute(url); } //自定義獲取圖片Task private class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> { ImageView imageView; public ImageDownloadTask(ImageView imageView) { this.imageView = imageView; } protected
Bitmap doInBackground(String... addresses) { Bitmap bitmap = null; InputStream in; try { // 建立URL連線 URL url = new URL(addresses[0]); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 開啟輸入流 conn.connect(); in = conn.getInputStream(); // 編碼輸入流 bitmap = BitmapFactory.decodeStream(in); } catch (IOException e) { e.printStackTrace(); } finally { if(in != null) in.close(); } return bitmap; } // Task執行完畢,返回bitmap @Override protected void onPostExecute(Bitmap result) { // Set bitmap image for the result imageView.setImageBitmap(result); } } }

可以看出來以上程式碼非常繁瑣,但是如果換成我們今天要講的Picasso那麼這個步驟就變得簡單了很多。

什麼是Picasso:強大的圖片下載快取的第三方庫;我覺得這就是對它最準確的描述了,至於其他特性,可以參見官網介紹

1、基本使用方法

Picasso.with(Context).load(imageurl).into(ImageView);
對,你沒有看錯,一行程式碼就搞定了我們的圖片載入!

這行程式碼為我們解決了什麼問題:

  • 自動將影象快取在本地
  • 通過圖片壓縮轉換以減少記憶體消耗
  • 自動處理了ImageView的回收,即自動取消不在視野範圍內的ImageView檢視資源的載入

2、剪裁圖片

Picasso.with(context).load(url) .resize(50, 50).centerCrop().into(imageView);
是不是也非常簡單

3、佔位圖片
picasso提供了兩種佔位圖片,未載入完成或者載入發生錯誤的時需要一張圖片作為提示。

Picasso.with(MainActivity.this).load("http://square.github.io/picasso/static/sample.png").placeholder(R.mipmap.loading).error(R.mipmap.ic_launcher).into(img);

然後呢,Picasso還提供了debug的標示,呼叫picasso的setIndicatorsEnabled方法,true是debug模式,跟蹤程式碼其實就是在最後生成的PicassoDrawable類的ondraw裡繪製了個左上角小三角