編輯:關於Android編程
一、簡介:
Picasso是Square公司開源的一個Android圖形緩存庫。可以實現圖片下載和緩存功能。
二、Picasso的特性
Picasso是一個Android圖片加載緩存框架,它具有如下特性:
1.支持任務優先級,會優先加載“優先級”較高的圖片。
2.帶有統計監控功能,可以統計緩存命中率,實時監控已使用的內存等等。
3.能夠根據當前網絡狀態自動調整並發線程數。
4.支持圖片的延遲加載。
5.本身不具有本地緩存,而是使用的OkHttp實現。
Picasso除了使用上比較簡單、功能特性豐富以外,還具備的一大優點便是源碼清晰易讀,適合於閱讀學習。
三、Picasso的基本使用
1. 添加依賴
在使用Picasso前,首先我們要添加依賴,如果使用的是Gradle,那只需要在模塊的build.gradle
中添加如下語句:
compile 'com.squareup.picasso:picasso:2.5.2'
當然也可以下載jar包,然後添加到項目中,這裡就不再贅述了。
2. 顯示圖片
使用Picasso做到這點真的是簡單到不要不要的了,只需要下面一句即可:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
其中,context
為當前應用上下文,imageView
為我們想要在其中顯示圖片的ImageView
對象。 Picasso不僅會在我們指定的ImageView
中顯示指定圖片,而且還會幫助我們做好以下幾件事(很貼心有木有):
1.在Adapter
中檢測View
的重用並自動取消之前的下載。
2.對於一些復雜圖片變換,也只需要比較小的內存。
3.自動進行內存緩存及磁盤緩存。
(1)自動取消圖片下載
當Picasso檢測到convertView
不為空(View的重用)時,它會自動取消之前對於convertView
的下載任務。
@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,我們可以很容易的對圖片進行變換,以減少內存占用或是更適應於布局。只需要像下面一樣的一個鏈式調用(很簡單有木有):
Picasso.with(context) .load(url) .resize(50,50) .centerCrop() .into(imageView);
當然,我們也可以進行更加復雜的變換,通過實現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);
當重試三次仍然無法成功加載圖片就會顯示error
方法參數中指定的圖片。
(4)資源加載
在使用Picasso時,Resources、assets、文件系統、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);
四、實例演示
下面實現一個ListView
顯示網絡圖片:
這裡找了四張網絡菜譜圖片,在代碼中新添加一個菜類:
//表示菜類(經過烹調的蔬菜、蛋品、肉類等) 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; } }
主界面類中,調用load
方法加載網絡圖片,調用into
方法將圖片設置給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); //這裡就是異步加載網絡圖片的地方 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; } }
五、總結
以上就是本文的全部內容了,看到這裡,是不是已經愛上了Picasso,快去和它愉快的玩兒耍吧,希望本文對大家的學習和工作能有所幫助。
音頻條形圖如下圖所示就是這次的音頻條形圖:由於只是自定義View的用法,我們就不去真實地監聽音頻輸入了,隨機模擬一些數字即可。如果要實現一個如上圖的靜態音頻條形圖,相信大
好的APP應當具備良好的交互, 最好能貼心的滿足用戶的需求. 而人性化的提醒就是其中之一. 某些APP中經常會看到這樣的場景, 當加載內容失敗, 或者獲取內容失敗時, 界
我們在做Android應用尤其是商業應用的時候,很多時候都需要後期版本升級,如果我們的數據庫文件非常大,比如游戲之類的,這時候就不應該每次版本更新都去重新復制數據庫。將數
第一次接觸樹形ListView是一年前,當時公司做的項目是一個企業的員工管理軟件,在展示員工時用到的,我花了大半天時間,才把樹形ListView搞明白,完成任務後就沒有然