官网地址: http://square.github.io/picasso/
下载地址: https://repo1.maven.org/maven2/com/squareup/picasso/picasso/
在线API: http://square.github.io/picasso/2.x/picasso/
Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题。
Picasso主要有以下特点:1.在adapter中取消不在视野范围的ImageView图片资源加载,解决了图片错位的问题;
2.使用最少的内存完成图片的转换;
3.实现的内存缓存和磁盘缓存。
4.图形的转换,比如大小、旋转等;
5.加载网络图片和本地图片。
Picasso使用起来相对于一般的图片下载也非常的简单:
一般图片下载主要有以下几个步骤:1.使用异步任务加载图片(如:Handler + Thread),获取图片资源;
2.是一个BitmapFactory对图片进行解码,转换成Bitmap对象;
3.将图片显示到ImageView。
Picasso的简单使用
① 一行代码即可完成图片的加载和显示:
Picasso.with(context).load("http://img15.3lian.com/2015/h1/294/d/9.jpg").into(imageView);当然在使用Picasso需要导入Picasso的包,如果是使用Eclipse开发,就通过上面提供的地址下载jar包,然后导入到项目中,如果是使用Android studio进行开发,就可以直接通过一下方式即可:
dependencies {
// ... 项目中使用的其他包或库
compile 'com.squareup.picasso:picasso:2.5.2'
}
另外一定要记得添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
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(new File(...)).into(imageView3);
③ 轻易实现图形的转换:
// 指定图片大小
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
// 指定图片大小并旋转图片
Picasso.with(context)
.load(imgUrl)
.resize(width, height)
.centerCrop()
.rotate(30);
.into(imageView);
absListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
//如果在暂停或者触摸的情况下开始加载
PicassoUtils.newInstance(context).getPicasso().resumeTag(context);
} else {
//停止加载
PicassoUtils.newInstance(context).getPicasso().pauseTag(context);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
⑤ 指定正在加载和加载失败显示的图片:
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
⑥ 还可以自定义图形变换:
/**关于Picasso更多的方法可以查看官方API文档,地址:http://square.github.io/picasso/2.x/picasso/
* 变换图片对象
*/
public class ChangeTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
// 将图片变换为圆形显示
int width = source.getWidth();
int height = source.getHeight();
int centerX = width / 2;
int centerY = height / 2;
int radius = Math.min(width, height) / 2;
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas canvas = new Canvas(result);
canvas.drawCircle(centerX, centerY, radius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
if (result == null) {
result = source;
}
source.recycle();
return result;
}
@Override
public String key() {
// 返回一个唯一键用作缓存的目的
return "change_transform - " + System.currentTimeMillis() + " - " + random.nextLong();
}
}
下面是一个简单的例子,效果图如下(因为上传的大小限制了,所以作为两张图片上传):
效果就是这样,下面说一下这个Demo代码的一些地方,主要是写了几个工具类:
1.Picasso的工具类PicassoUtils
这个类使用单例设计模式,全局使用一个,也就是全局使用一个Picasso对象,在Demo中我是在基类(BaseActivity)中初始化的;在PicassoUtils这个类中封装了一些加载图片的方法,加载图片时调用一个方法即可;另外在这个类中写了一个图形装换的方法的内部类,可以将图片转换为圆形和指定圆角大小的圆角矩形,其他转换可以根据需要进行扩展。
2.图形工具类BitmapUtils
这个类中都是静态方法,提供了一些对Bitmap对象操作的方法,包括将图片变为圆角矩形、圆形、对图片进行压缩处理、水平翻转原图、将彩色图片变为黑白图片等一些方法。
3.针对ListView和GridView这类控件类
在这个类中写了一个方法,调用这个方法,将ListView或GridView传入就可以实现快速滑动时不加载图片,手指触摸滑动或停止滑动时恢复加载图片。
Demo源代码已经上传,点击进入下载页下载Demo源码,源码是一个Android Studio项目,下载之后解压,直接用Android Studio打开即可,不要导入。