英文官网地址:http://square.github.io/picasso/
在Android开发中,我们往往会需要远程获取图片并且显示在客户端上面,从前我们都是使用HttpUrlConnection和AsyncTask这种原生的方式来完成,但是到了现在就不推荐这样使用了,因为这样会需要我们编写大量代码,还需要处理缓存和下载管理等。
Picasso:A Powerful Image Downloading and Caching Library for Android
Picasso(毕加索),外国人起名字还是很有意思的,根据名字我们基本可以知道它是跟图片有关的框架
我们都知道,在主线程中是无法执行耗时操作的,所以需要AsyncTask,将耗时操作运行在后台线程中。网络加载图片也是一样的,例如:
public class MainActivity extends Activity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
String url = "http://www.jycoder.com/json/Image/1.jpg";
// 执行Task
new ImageDownloadTask(ivBasicImage).execute(url);
}
//自定义获取图片Task
private class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> {
ImageView imageView;
public ImageDownloadTask(ImageView imageView) {
this.imageView = imageView;
}
protected Bitmap doInBackground(String... addresses) {
Bitmap bitmap = null;
InputStream in;
try {
// 建立URL连接
URL url = new URL(addresses[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 打开输入流
conn.connect();
in = conn.getInputStream();
// 编码输入流
bitmap = BitmapFactory.decodeStream(in);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(in != null)
in.close();
}
return bitmap;
}
// Task执行完毕,返回bitmap
@Override
protected void onPostExecute(Bitmap result) {
// Set bitmap image for the result
imageView.setImageBitmap(result);
}
}
}
可以看出来以上代码非常繁琐,但是如果换成我们今天要讲的Picasso那么这个步骤就变得简单了很多。
什么是Picasso:强大的图片下载和缓存的第三方库;我觉得这就是对它最准确的描述了,至于其他特性,可以参见官网介绍
1、基本使用方法
Picasso.with(Context).load(imageurl).into(ImageView);对,你没有看错,一行代码就搞定了我们的图片加载!
这行代码为我们解决了什么问题:
- 自动将图像缓存在本地
- 通过图片压缩转换以减少内存消耗
- 自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载
2、剪裁图片
Picasso.with(context).load(url) .resize(50, 50).centerCrop().into(imageView);是不是也非常简单
3、占位图片
picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。
Picasso.with(MainActivity.this).load("http://square.github.io/picasso/static/sample.png").placeholder(R.mipmap.loading).error(R.mipmap.ic_launcher).into(img);
然后呢,Picasso还提供了debug的标示,调用picasso的setIndicatorsEnabled方法,true是debug模式,跟踪代码其实就是在最后生成的PicassoDrawable类的ondraw里绘制了个左上角小三角