图片框架Picasso的简单使用

时间:2021-08-28 19:50:26
Picasso 是Square公司开源的一个Android图形缓存库,实现图片下载和缓存功能。
官网地址: 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不仅可以加载网络图片,也可以加载本地(资源)文件图片:

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);


④ 当ListView、GridView快速滑动时,使用Picasso不加载图片:

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);


⑥ 还可以自定义图形变换:

/**
* 变换图片对象
*/
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();
}
}
关于Picasso更多的方法可以查看官方API文档,地址:http://square.github.io/picasso/2.x/picasso/

下面是一个简单的例子,效果图如下(因为上传的大小限制了,所以作为两张图片上传):

图片框架Picasso的简单使用              图片框架Picasso的简单使用

效果就是这样,下面说一下这个Demo代码的一些地方,主要是写了几个工具类:

1.Picasso的工具类PicassoUtils

这个类使用单例设计模式,全局使用一个,也就是全局使用一个Picasso对象,在Demo中我是在基类(BaseActivity)中初始化的;在PicassoUtils这个类中封装了一些加载图片的方法,加载图片时调用一个方法即可;另外在这个类中写了一个图形装换的方法的内部类,可以将图片转换为圆形和指定圆角大小的圆角矩形,其他转换可以根据需要进行扩展。

2.图形工具类BitmapUtils

这个类中都是静态方法,提供了一些对Bitmap对象操作的方法,包括将图片变为圆角矩形、圆形、对图片进行压缩处理、水平翻转原图、将彩色图片变为黑白图片等一些方法。

3.针对ListView和GridView这类控件类

在这个类中写了一个方法,调用这个方法,将ListView或GridView传入就可以实现快速滑动时不加载图片,手指触摸滑动或停止滑动时恢复加载图片。


Demo源代码已经上传,点击进入下载页下载Demo源码,源码是一个Android Studio项目,下载之后解压,直接用Android Studio打开即可,不要导入。