盒子
盒子
文章目录
  1. 前言
  2. Picasso 基本介绍
  3. 优点
  4. 基本使用方法
    1. 1、加载图片到 ImageView
    2. 2、加载图片并自定义动作
    3. 3、对图片进行变换
  5. 案例: 实现异步加载图片的ListView
  6. 参考文献

Picasso使用入门

前言

图片加载是 Android 开发经常要实现的功能,而这也是谈到 Android 性能优化问题时不得不提的问题,而 Picasso 项目就是帮助我们解决这个问题的,而我在网上搜也没找到比较全面关于 Picasso 的中文教程,因此这里就写一篇关于 Picasso 这个开源项目的介绍。

Picasso 基本介绍

  • 项目地址:https://github.com/square/picasso
  • 项目定位:A powerful image downloading and caching library for Android,即实现图片加载、图片缓存的功能。
  • 该项目的依赖项目有:okHttp, okHttp-urlConnection, okio。如果通过jar包方式添加则需要注意版本,本文用的版本是:Picasso 2.3.4, okHttp 2.0.0, okHttp-urlConnection 2.0.0, okio 1.0.0;如果通过 gradle 添加那么依赖就自动添加进来了。
  • 很多人会把它和 UIL 项目比较,如果你刚刚接触图片异步加载,则我比较推荐 Picasso,因为使用起来太方便了。

优点

1、入门简单:一般为了实现一个图片异步加载的功能,少说必须要使用:AsyncTask, LruCache, DiskCache, BitmapFactory 等等,实现起来还是有难度的,但是 Picasso 只需要一行代码即可实现图片异步加载:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

是不是非常方便。

2、自动取消Adapter的下载任务:一般来说我们在实现 ListView 时会重用 view,比如第10个位置的 view 重用第1个位置的 view,当从第1个位置快速滑到第10个位置时,虽然第1个位置的图片还没下载好,Picasso 能够帮我们自动取消第1个位置的下载任务,开始第10个位置的下载任务,我们只需要管业务逻辑即可。

3、利用最少的内存对图片进行变换:简单的 API 即可实现图片的旋转、改变大小等简单变换,还能够自定义变换。

4、自动进行内存和磁盘的缓存: 不需要自己实现缓存(缺点是不能设定缓存大小),当然你在加载图片时也可以设置成不使用缓存(skipMemoryCache)。

5、提供很好的调试界面:如果开启调试模式,则如果图片是从网络中获得,则图片左上角会有红色三角形;如果图片从磁盘获得,则图片左上角会有黄色三角形;如果图片从内存获得,则图片左上角会有绿色三角形。如图所示:

6、支持通过资源id、本地文件、网络载入图片: load() 函数即可实现从不同的来源载入图片。

基本使用方法

一般我遇到的需要实现的功能就是三个:

  • 简单实现异步加载图片到 ImageView,并在图片加载成功或失败时有个回调,即当图片加载成功时可以自定义一些操作,当图片加载失败时可以自定义一些操作。
  • 下载图片并保存到本地。
  • 对加载的图片进行变换。

接下去我将会介绍常用的一些函数。

1、加载图片到 ImageView

ImageView view = null;
Picasso picasso = Picasso.with(this);
picasso.setIndicatorsEnabled(true); //开启调模式,它能够在图片左上角显示小三角形,这个小三角形的颜色标明了图片的来源:网络、内存缓存、磁盘缓存
picasso.setLoggingEnabled(true); //打开日志,即log中会打印出目前下载的进度、情况
picasso.load("http://xxx.jpg") //可以是本地图片或网络图片
.placeholder(R.drawable.placeholder) //当图片正在加载时显示的图片(optional)
.error(R.drawable.error) //当图片加载失败时显示的图片(optional)
.into(view, new Callback() { //将图片下载完后放进view中,回调是可选的
@Override
public void onSuccess() {
//加载图片成功时回调
}
@Override
public void onError() {
//加载图片失败时回调
}
});

2、加载图片并自定义动作

Target target = new Target(){
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) {
//当图片加载成功时调用,bitmap是加载的图片,loadFrom 标明图片的来源是网络、内存还是磁盘
//可以在里面执行把图片保存到本地的操作
}
@Override
public void onBitmapFailed(Drawable errorDrawable) { //当图片加载失败时调用
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) { //当任务被提交时调用
}
};
picasso.load(new File("/1.jpg")).into(target); //指定target任务加载图片

3、对图片进行变换

Transformation transformation = new Transformation() {
@Override
public Bitmap transform(Bitmap bitmap) {
Bitmap newBitmap = null;
//自定义变换
if(bitmap != null && !bitmap.isRecycled()){ //将旧图片回收
bitmap.recycle();
}
return newBitmap;
}
@Override
public String key() { // 将用作cache的key
return "key";
}
};
picasso.load(R.drawable.download)
.skipMemoryCache() //不要把加载的图片放入缓存,也不要从缓存中取图片
.transform(transformation) //执行自定义变换
.into(view);

案例: 实现异步加载图片的ListView

效果如下:

我们使用到了通用适配器技术(实现代码为 CommonAdapter 项目),使得我们的主要代码只有30+行:

public class SimpleListActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_list);
List<DataItem> datas = getSampleDatas();
ListView listView = (ListView)findViewById(R.id.list);
Picasso.with(this).setIndicatorsEnabled(true);
listView.setAdapter(new CommonAdapter<DataItem>(this,datas,R.layout.item_list) {
@Override
public void convert(ViewHolder holder, DataItem item,int position) {
holder.setText(R.id.text,item.name);
holder.setImage(R.id.image,item.url,null); //setImage 函数中使用了 Picasso 库
}
});
}
private List<DataItem> getSampleDatas() {
List<DataItem> datas = new ArrayList<DataItem>();
String[] urls = getResources().getStringArray(R.array.urls);
for(int i = 0; i < urls.length; i++){
DataItem item = new DataItem(urls[i],urls[i]);
datas.add(item);
}
return datas;
}
}
class DataItem{
String url;
String name;
public DataItem(String url, String name){
this.url = url;
this.name = name;
}
}

参考文献

支持一下
扫一扫,支持xiazdong