Android入門教程之Picasso框架
一、簡介:
Picasso是Square公司開源的一個Android圖形緩存庫??梢詫崿F(xiàn)圖片下載和緩存功能。
二、Picasso的特性
Picasso是一個Android圖片加載緩存框架,它具有如下特性:
1.支持任務(wù)優(yōu)先級,會優(yōu)先加載“優(yōu)先級”較高的圖片。
2.帶有統(tǒng)計監(jiān)控功能,可以統(tǒng)計緩存命中率,實時監(jiān)控已使用的內(nèi)存等等。
3.能夠根據(jù)當(dāng)前網(wǎng)絡(luò)狀態(tài)自動調(diào)整并發(fā)線程數(shù)。
4.支持圖片的延遲加載。
5.本身不具有本地緩存,而是使用的OkHttp實現(xiàn)。
Picasso除了使用上比較簡單、功能特性豐富以外,還具備的一大優(yōu)點(diǎn)便是源碼清晰易讀,適合于閱讀學(xué)習(xí)。
三、Picasso的基本使用
1. 添加依賴
在使用Picasso前,首先我們要添加依賴,如果使用的是Gradle,那只需要在模塊的build.gradle
中添加如下語句:
compile 'com.squareup.picasso:picasso:2.5.2'
當(dāng)然也可以下載jar包,然后添加到項目中,這里就不再贅述了。
2. 顯示圖片
使用Picasso做到這點(diǎn)真的是簡單到不要不要的了,只需要下面一句即可:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
其中,context
為當(dāng)前應(yīng)用上下文,imageView
為我們想要在其中顯示圖片的ImageView
對象。 Picasso不僅會在我們指定的ImageView
中顯示指定圖片,而且還會幫助我們做好以下幾件事(很貼心有木有):
1.在Adapter
中檢測View
的重用并自動取消之前的下載。
2.對于一些復(fù)雜圖片變換,也只需要比較小的內(nèi)存。
3.自動進(jìn)行內(nèi)存緩存及磁盤緩存。
(1)自動取消圖片下載
當(dāng)Picasso檢測到convertView
不為空(View的重用)時,它會自動取消之前對于convertView
的下載任務(wù)。
@Override public voidgetView(intposition,View convertView,ViewGroup parent) { SquaredImageView view = (SquaredImageView) convertView; if(view ==null) { view =newSquaredImageView(context); } String url = getItem(position); Picasso.with(context).load(url).into(view); }
(2)圖片變換
使用Picasso,我們可以很容易的對圖片進(jìn)行變換,以減少內(nèi)存占用或是更適應(yīng)于布局。只需要像下面一樣的一個鏈?zhǔn)秸{(diào)用(很簡單有木有):
Picasso.with(context) .load(url) .resize(50,50) .centerCrop() .into(imageView);
當(dāng)然,我們也可以進(jìn)行更加復(fù)雜的變換,通過實現(xiàn)Picasso中的Transformation
接口,我們可以自定義一個“圖片變換器”。示例代碼如下:
public class CropSquareTransformation implements Transformation { @Override public Bitmaptransform(Bitmap source) { int size = Math.min(source.getWidth(),source.getHeight()); int x = (source.getWidth() - size) /2; int y = (source.getHeight() - size) /2; Bitmap result = Bitmap.createBitmap(source,x,y,size,size); if(result != source) { source.recycle(); } return result; } @Override public String key() { return "square()"; } }
把以上類的實例傳遞給transform
方法即可完成對圖片的自定義變換。
(3)占位符(place holders)
Picasso支持在圖片下載過程中以及圖片加載失敗時顯示一個“占位符圖片”,這個特性使用起來也很簡單,請看以下示例代碼:
Picasso.with(context) .load(url) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(imageView);
當(dāng)重試三次仍然無法成功加載圖片就會顯示error
方法參數(shù)中指定的圖片。
(4)資源加載
在使用Picasso時,Resources、assets、文件系統(tǒng)、ContentProvider都可以作為圖片的來源(很方便有木有):
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1); Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2); Picasso.with(context).load(newFile(...)).into(imageView3);
四、實例演示
下面實現(xiàn)一個ListView
顯示網(wǎng)絡(luò)圖片:
這里找了四張網(wǎng)絡(luò)菜譜圖片,在代碼中新添加一個菜類:
//表示菜類(經(jīng)過烹調(diào)的蔬菜、蛋品、肉類等) public class Dish { private String imgUrl; // 圖片地址 private String name; // 菜名 private String price; // 菜價 public Dish(String imgUrl, String name, String price) { this.imgUrl = imgUrl; this.name = name; this.price = price; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } }
主界面類中,調(diào)用load
方法加載網(wǎng)絡(luò)圖片,調(diào)用into
方法將圖片設(shè)置給ImageView
之類的組件:
import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.squareup.picasso.Picasso; public class MainActivity extends Activity { private static final String BASE_URL = "http://img1.3lian.com/img2011/w1/106/85/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<Dish> dishList = new ArrayList<Dish>(); dishList.add(new Dish(BASE_URL + "42.jpg", "水煮魚片", "38.00")); dishList.add(new Dish(BASE_URL + "34.jpg", "小炒肉", "18.00")); dishList.add(new Dish(BASE_URL + "37.jpg", "清炒時蔬", "15.00")); dishList.add(new Dish(BASE_URL + "11.jpg", "金牌烤鴨", "36.00")); dishList.add(new Dish(BASE_URL + "12.jpg", "粉絲肉煲", "20.00")); ListView mListView = (ListView) this.findViewById(R.id.listview); MainListViewAdapter adapter = new MainListViewAdapter(dishList); mListView.setAdapter(adapter); } // ListView適配器 private class MainListViewAdapter extends BaseAdapter { private ArrayList<Dish> dishList; public MainListViewAdapter(ArrayList<Dish> list) { this.dishList = list; } @Override public int getCount() { return dishList.size(); } @Override public Object getItem(int position) { return dishList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ListViewItemHolder item = null; if (convertView == null) { convertView = LayoutInflater.from(MainActivity.this).inflate( R.layout.main_listview_item, null); item = new ListViewItemHolder(); item.img_iv = (ImageView) convertView .findViewById(R.id.imageView1); item.name_textview = (TextView) convertView .findViewById(R.id.textView1); item.price_textview = (TextView) convertView .findViewById(R.id.textView2); convertView.setTag(item); } else { item = (ListViewItemHolder) convertView.getTag(); } Dish dish = dishList.get(position); //這里就是異步加載網(wǎng)絡(luò)圖片的地方 Picasso.with(MainActivity.this).load(dish.getImgUrl()) .into(item.img_iv); item.name_textview.setText(dish.getName()); item.price_textview.setText(dish.getPrice() + "元"); return convertView; } } // ListView的Item組件類 private class ListViewItemHolder { ImageView img_iv; TextView name_textview; TextView price_textview; } }
五、總結(jié)
以上就是本文的全部內(nèi)容了,看到這里,是不是已經(jīng)愛上了Picasso,快去和它愉快的玩兒耍吧,希望本文對大家的學(xué)習(xí)和工作能有所幫助。
相關(guān)文章
Android實現(xiàn)調(diào)用系統(tǒng)圖庫與相機(jī)設(shè)置頭像并保存在本地及服務(wù)器
這篇文章主要介紹了Android實現(xiàn)調(diào)用系統(tǒng)圖庫與相機(jī)設(shè)置頭像并保存在本地及服務(wù)器 ,需要的朋友可以參考下2017-03-03Android6.0 Launcher2應(yīng)用解析
這篇文章主要為大家詳細(xì)介紹了Android6.0 Launcher2應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Android RecyclerView 數(shù)據(jù)綁定實例代碼
本文主要介紹Android RecyclerView 數(shù)據(jù)綁定的資料,這里詳細(xì)說明如何實現(xiàn) Android RecyclerView的數(shù)據(jù)綁定,并附示例代碼,有需要的小伙伴可以參考下2016-09-09Android模擬器實現(xiàn)手機(jī)添加文件到sd卡的方法
這篇文章主要介紹了Android模擬器實現(xiàn)手機(jī)添加文件到sd卡的方法,詳細(xì)分析了Android模擬器添加文件到sd卡的步驟與相關(guān)技巧,需要的朋友可以參考下2016-06-06Android關(guān)于Glide的使用(高斯模糊、加載監(jiān)聽、圓角圖片)
這篇文章主要為大家詳細(xì)介紹了Android關(guān)于Glide的使用,內(nèi)容豐富,高斯模糊、加載監(jiān)聽、圓角圖片希望大家可以掌握,感興趣的小伙伴們可以參考一下2016-11-11學(xué)習(xí)使用Material Design控件(一)
這篇文章主要為大家介紹了學(xué)習(xí)使用Material Design控件的詳細(xì)教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Android實現(xiàn)取消GridView中Item選中時默認(rèn)的背景色
這篇文章主要介紹了Android實現(xiàn)取消GridView中Item選中時默認(rèn)的背景色,涉及Android GridView中Item屬性設(shè)置的相關(guān)技巧,需要的朋友可以參考下2016-02-02