<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"/>