天天看點

Picasso基本使用

<span style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋體, PMingLiU, serif; background-color: rgb(255, 255, 255);">一、加載圖檔</span>
           

1.從URL加載圖像     Picasso庫使用一個實作自Picasso class的流暢接口。Picasso淚至少需要三個參數去完成一次功能性的請求:         ·with(Context context) - Context對許多Android API來說都是必須的,Picasso也不例外。         ·load(String imageUrl) - 在這裡明确要加載哪個圖檔。大多數時候這裡會是一個String類型去執行一個網絡圖檔。         ·into(ImageView targetImageView) - 圖檔需要被顯示在那個特定的ImageView上。     理論上的說明仍然是很難了解的,是以我們來看一個例子:

String internetUrl = "http://i.imgur.com/DvpvklR.png";
Picasso
  .with(this)
  .load(internetUrl)
  .into(imageView);
           

    隻要URL指向的圖檔存在并且ImageView可用,幾秒鐘之後圖檔就會顯示出來。為了防止圖檔不存在,你稍後可以看到Picasso将資訊傳回到錯誤回調(error callbacks)中。

2.從資源中加載     不同于提供一個String類型的URL,這裡需要一個int類型的資源id。

int resourceId = R.mipmap.icon_head_default;
Picasso
  .with(this)
  .load(resourceId)
  .into(imageView);
           

3.從File中加載     當你需要使用者選擇一張照片去顯示時,這種方式是非常有用的。參數僅僅是一個File對象。

Uri uri = resourceIdToUri(this,R.mipmap.icon_head_default);
Picasso
  .with(this)
  .load(uri)
  .into(imageView);
           

    下面是将resourceId轉換成Uri的方法:

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FOREWARD_SLASH = "/";
private Uri resourceIdToUri(Context context, int resourceId) {
    return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
}
           

二、擴充卡(ListView、GridView...) 1.ListView     首先,我們需要一些測試圖檔。

public static String[] eatFoodyImages = {
  "http://i.imgur.com/rFLNqWI.jpg",
  "http://i.imgur.com/C9pBVt7.jpg",
  "http://i.imgur.com/rT5vXE1.jpg",
  "http://i.imgur.com/aIy5R2k.jpg",
  "http://i.imgur.com/MoJs9pT.jpg",
  "http://i.imgur.com/S963yEM.jpg",
  "http://i.imgur.com/rLR2cyc.jpg",
  "http://i.imgur.com/SEPdUIx.jpg",
  "http://i.imgur.com/aC9OjaM.jpg",
  "http://i.imgur.com/76Jfv9b.jpg",
  "http://i.imgur.com/fUX7EIB.jpg",
  "http://i.imgur.com/syELajx.jpg",
  "http://i.imgur.com/COzBnru.jpg",
  "http://i.imgur.com/Z3QjilA.jpg",
};
           

    然後,我們需要一個activity去建立一個adapter并設定給ListView:

listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new ImageListAdapter(this,eatFoodyImages));
           

    第三,需要一個用于展示ListView中每個Item的布局:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"/>
           

    在得到結果之前,我們需要去實作一個adapter。

private class ImageListAdapter extends ArrayAdapter {
  private Context context;
  private LayoutInflater inflater;
  private String[] imageUrls;
  public ImageListAdapter(Context context, String[] imageUrls) {
    super(context,R.layout.list_item_image,imageUrls);
    this.context = context;
    this.imageUrls = imageUrls;
    inflater = LayoutInflater.from(context);
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    if(null == convertView){
      convertView = inflater.inflate(R.layout.list_item_image,parent,false);
    }
    Picasso
      .with(context)
      .load(imageUrls[position])
      .fit()
      .into((ImageView) convertView);
    return convertView;
  }
}
           

    當你上下滾動的很快時,你會發現這些圖檔顯示的比之前更快。于是你可以猜測,這些圖檔都是來自于cache并且不再從網絡上加載。Picasso的cache實作的非常全面,并且對我們來說,許多事情變得更加簡單了。cache的大小是基于裝置磁盤的大小的。     當加載一個圖檔時,Picasso使用三層緩存:記憶體、硬碟和網絡。當需要去建立一個合适的cache時,Picasso把這些複雜的操作全都隐藏起來,于是我們可以什麼也不用做。當然,根據Square的設計理念,你也可以修改或重寫chche元件。 2.GridView     GridView的實作方式與ListView的實作方式沒有多少差別,你甚至可以使用同一個adapter,隻要把布局變成GridView就可以了:

<GridView
        android:id="@+id/gistView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="2"/>
           

繼續閱讀