Picasso 使用详解及简单解析
Picasso 是什么
官方介绍:A powerful image downloading and caching library for Android. 简单来说就是针对安卓平台的一个非常牛逼的图片加载库。
官网地址
Picasso 使用
显示网络图片到ImageView上
极致简单
布局文件中声明ImageView控件
<ImageView
android:id="@+id/iv_img"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"/>
代码中加载图片(添加网络权限)
Picasso.with(context).load("http://192.168.X.XXX:8080/http/girl.jpg").into(imageView);
此时运行,如果网络正常应该就能看到显示出来的图片了
添加加载过渡图片
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.into(imageView);
在加载完成前会先展示占位图片
加载失败显示图片
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
加载失败显示设置的错误图片
改变图片大小
两张照片,大小分别设置为[300,300]和[600,600]
- resize
- resizeDimen
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resize(300, 300)
.centerCrop()
.into(imageView);
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resize(600, 600)
.centerCrop()
.into(imageView2);
注:resize的单位为px,如果想要使用dp单位指定大小,使用另外的方法:resizeDimen
resizeDimen 方法需要注意必须通过引用方式,如果直接指定大小会出错
img[5]
正确使用方式:
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resizeDimen(R.dimen.img_width_150, R.dimen.img_height_150)
.centerCrop()
.into(imageView);
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.resizeDimen(R.dimen.img_width_300, R.dimen.img_height_300)
.centerCrop()
.into(imageView2);
fit() 方法不能和resize()同时使用
图片旋转
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.rotate(90)
.into(imageView);
缓存策略
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE)
.into(imageView);
- MemoryPolicy.NO_CACHE 去掉内存缓存
- MemoryPolicy.NO_STORE 去掉硬盘缓存
图片转换
transform()
需要自己实现,完成对图片的二次处理
比如需要显示为圆形头像:
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.transform(new Transformation() {
@Override
public Bitmap transform(Bitmap source) {
int width = source.getWidth();
int height = source.getHeight();
int size = Math.min(width, height);
Bitmap blankBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(blankBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawCircle(size / 2, size / 2, size / 2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
if (source != null && !source.isRecycled()) {
source.recycle();
}
return blankBitmap;
}
@Override
public String key() {
return "girl";
}
})
.into(imageView);
开启指示器
通过开启指示器,显示这个图片是从内存加载来的还是从SD卡加载来的还是从网络加载来的。开启后会在图片左上角显示一个三角形图案。
Picasso picasso = Picasso.with(this);
picasso.setIndicatorsEnabled(true);
picasso
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
有三种颜色
- 红 网络
- 蓝 SD卡
- 绿 内存
添加监听器
Picasso.with(this)
.load("http://192.168.X.XXX:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
停止加载、恢复加载
在列表滑动时可以停止加载,列表滑动结束恢复加载
Object tag = new Object();
Picasso picasso = Picasso.with(this);
picasso.pauseTag(tag);//暂停加载
picasso.resumeTag(tag);//回复加载
取消加载
Picasso picasso = Picasso.with(this);
Picasso.with(this)
.load("http://192.168.9.232:8080/http/girl.jpg")
.placeholder(R.mipmap.boy)
.error(R.mipmap.err)
.into(imageView);
picasso.cancelRequest(imageView);//取消加载
如果没有取消显示正常加载图片,如果加上取消下载代码,则显示错误图片
Picasso 缓存简单分析
Picasso 内部访问网络,下载图片使用 createDefaultDownloader()方法来创建下载器,默认使用okhttp,如果当前项目没有找到okhttp包,则使用HttpURlConnection.
源代码:
static Downloader createDefaultDownloader(Context context) {
try {
Class.forName("com.squareup.okhttp.OkHttpClient");
return Utils.OkHttpLoaderCreator.create(context);
} catch (ClassNotFoundException var2) {
return new UrlConnectionDownloader(context);
}
}
Picasso没有指定缓存文件地址的接口,所以下载到本地的缓存文件地址默认是okhttp等的配置。
源代码:
static File createDefaultCacheDir(Context context) {
File cache = new File(context.getApplicationContext().getCacheDir(), "picasso-cache");
if(!cache.exists()) {
cache.mkdirs();
}
return cache;
}
可以看到是默认保存在内部缓存中,去相应目录下查找可以看到两个文件,分别以.0和.1结尾。
其中以.0结尾的文件是网络通信信息,可以改后缀名为.txt查看,以.1结尾的文件就是下载缓存的图片信息,可以更改后缀名为.jpg或.png查看。
那么如果想要更改下载文件的缓存地址呢?需要自己定义一个下载器:
Picasso picasso = new Picasso.Builder(this)
.downloader(new OkHttp3Downloader(this.getExternalCacheDir()))
.build();
这个下载器可以直接使用大神JakeWharton写的:picasso2-okhttp3-downloader
初步使用总结至此,不定期更新~~~
欢迎访问 博客 查看更多文章。