Android入門教程之Picasso框架
一、簡(jiǎn)介:
Picasso是Square公司開源的一個(gè)Android圖形緩存庫??梢詫?shí)現(xiàn)圖片下載和緩存功能。
二、Picasso的特性
Picasso是一個(gè)Android圖片加載緩存框架,它具有如下特性:
1.支持任務(wù)優(yōu)先級(jí),會(huì)優(yōu)先加載“優(yōu)先級(jí)”較高的圖片。
2.帶有統(tǒng)計(jì)監(jiān)控功能,可以統(tǒng)計(jì)緩存命中率,實(shí)時(shí)監(jiān)控已使用的內(nèi)存等等。
3.能夠根據(jù)當(dāng)前網(wǎng)絡(luò)狀態(tài)自動(dòng)調(diào)整并發(fā)線程數(shù)。
4.支持圖片的延遲加載。
5.本身不具有本地緩存,而是使用的OkHttp實(shí)現(xiàn)。
Picasso除了使用上比較簡(jiǎn)單、功能特性豐富以外,還具備的一大優(yōu)點(diǎn)便是源碼清晰易讀,適合于閱讀學(xué)習(xí)。
三、Picasso的基本使用
1. 添加依賴
在使用Picasso前,首先我們要添加依賴,如果使用的是Gradle,那只需要在模塊的build.gradle中添加如下語句:
compile 'com.squareup.picasso:picasso:2.5.2'
當(dāng)然也可以下載jar包,然后添加到項(xiàng)目中,這里就不再贅述了。
2. 顯示圖片
使用Picasso做到這點(diǎn)真的是簡(jiǎn)單到不要不要的了,只需要下面一句即可:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
其中,context為當(dāng)前應(yīng)用上下文,imageView為我們想要在其中顯示圖片的ImageView對(duì)象。 Picasso不僅會(huì)在我們指定的ImageView中顯示指定圖片,而且還會(huì)幫助我們做好以下幾件事(很貼心有木有):
1.在Adapter中檢測(cè)View的重用并自動(dòng)取消之前的下載。
2.對(duì)于一些復(fù)雜圖片變換,也只需要比較小的內(nèi)存。
3.自動(dòng)進(jìn)行內(nèi)存緩存及磁盤緩存。
(1)自動(dòng)取消圖片下載
當(dāng)Picasso檢測(cè)到convertView不為空(View的重用)時(shí),它會(huì)自動(dòng)取消之前對(duì)于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,我們可以很容易的對(duì)圖片進(jìn)行變換,以減少內(nèi)存占用或是更適應(yīng)于布局。只需要像下面一樣的一個(gè)鏈?zhǔn)秸{(diào)用(很簡(jiǎn)單有木有):
Picasso.with(context)
.load(url)
.resize(50,50)
.centerCrop()
.into(imageView);
當(dāng)然,我們也可以進(jìn)行更加復(fù)雜的變換,通過實(shí)現(xiàn)Picasso中的Transformation接口,我們可以自定義一個(gè)“圖片變換器”。示例代碼如下:
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()";
}
}
把以上類的實(shí)例傳遞給transform方法即可完成對(duì)圖片的自定義變換。
(3)占位符(place holders)
Picasso支持在圖片下載過程中以及圖片加載失敗時(shí)顯示一個(gè)“占位符圖片”,這個(gè)特性使用起來也很簡(jiǎn)單,請(qǐng)看以下示例代碼:
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
當(dāng)重試三次仍然無法成功加載圖片就會(huì)顯示error方法參數(shù)中指定的圖片。
(4)資源加載
在使用Picasso時(shí),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);
四、實(shí)例演示
下面實(shí)現(xiàn)一個(gè)ListView顯示網(wǎng)絡(luò)圖片:
這里找了四張網(wǎng)絡(luò)菜譜圖片,在代碼中新添加一個(gè)菜類:
//表示菜類(經(jīng)過烹調(diào)的蔬菜、蛋品、肉類等)
public class Dish {
private String imgUrl; // 圖片地址
private String name; // 菜名
private String price; // 菜價(jià)
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", "清炒時(shí)蔬", "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é)
以上就是本文的全部?jī)?nèi)容了,看到這里,是不是已經(jīng)愛上了Picasso,快去和它愉快的玩兒耍吧,希望本文對(duì)大家的學(xué)習(xí)和工作能有所幫助。
相關(guān)文章
Android App后臺(tái)震動(dòng)的實(shí)現(xiàn)步驟詳解
這篇文章主要為大家介紹了Android App后臺(tái)震動(dòng)的實(shí)現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Android開發(fā)中使用achartengine繪制各種圖表的方法
這篇文章主要介紹了Android開發(fā)中使用achartengine繪制各種圖表的方法,結(jié)合具體實(shí)例形式分析了Android基于圖表生成類庫achartengine進(jìn)行圖表繪制的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android判斷服務(wù)是否運(yùn)行及定位問題實(shí)例分析
這篇文章主要介紹了Android判斷服務(wù)是否運(yùn)行及定位問題,以實(shí)例形式較為詳細(xì)的分析了Android判斷服務(wù)運(yùn)行狀態(tài)及獲取經(jīng)緯度的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
Android中EditText和AutoCompleteTextView設(shè)置文字選中顏色方法
這篇文章主要介紹了Android中EditText和AutoCompleteTextView設(shè)置文字選中顏色方法,本文給出了效果圖和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01
Android自定義控件實(shí)現(xiàn)滑動(dòng)開關(guān)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)滑動(dòng)開關(guān)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
Android客戶端post請(qǐng)求服務(wù)器端實(shí)例
這篇文章主要介紹了Android客戶端post請(qǐng)求服務(wù)器端實(shí)例,本文講解了Android客戶端與服務(wù)器端通信方式、解析服務(wù)器端返回?cái)?shù)據(jù)的解釋、用GET和POST訪問http資源等內(nèi)容,并給出了一個(gè)POST實(shí)例,需要的朋友可以參考下2015-06-06
Android應(yīng)用實(shí)現(xiàn)點(diǎn)擊按鈕震動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android應(yīng)用實(shí)現(xiàn)點(diǎn)擊按鈕震動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Button及ImageButton的背景屬性設(shè)置技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12

