picasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存功能。
当然使用起来也是非常的简单。
首先我们要依赖一下jar包:
compile 'com.squareup.picasso:picasso:2.5.2'
加载网络图片当然要添加网络权限:
最后只要调用一段简单的代码就可以,load传入图片链接,into传入图片控件:
Picasso.with(this).load(url).into(image);
load里面可以传入url、file、String。当然传入String框架底层还是会把他转成url:
public RequestCreator load(String path) {
if (path == null) {
return new RequestCreator(this, null, 0);
}
if (path.trim().length() == 0) {
throw new IllegalArgumentException("Path must not be empty.");
}
return load(Uri.parse(path));
}
picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。
Picasso.with(context).load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
转换图片以适应布局大小并减少内存占用,resize()方法传入的是像素值:
Picasso.with(this).load(url).resize(500, 500).centerCrop().into(image);
自定义转换图片的大小,key方法里返回值不能为null,不然会报错:
Transformation transformation = new Transformation() {
@Override
public Bitmap transform(Bitmap bitmap) {
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
int x = (bitmap.getWidth() - size) / 2;
int y = (bitmap.getHeight() - size) / 2;
//截取图片依次参数是 bitmap:要截取的图片,x:起始x坐标,y:起始y坐标,size:截取图片的宽度,size:截取图片的高度
Bitmap bp = Bitmap.createBitmap(bitmap,x,y,size,size);
if (bp != bitmap) {
bitmap.recycle();
}
return bp;
}
@Override
public String key() {
return "";
}
};
// 调用transformation
Picasso.with(this).load(url).transform(transformation).into(image);
Picasso没有自带圆角属性,如果你需要圆形图片,那就只能自己转换:
Transformation transformation = new Transformation() {
@Override
public Bitmap transform(Bitmap bitmap) {
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
int x = (bitmap.getWidth() - size) / 2;
int y = (bitmap.getHeight() - size) / 2;
//截取图片依次参数是 bitmap:要截取的图片,x:起始x坐标,y:起始y坐标,size:截取图片的宽度,size:截取图片的高度
Bitmap bp = Bitmap.createBitmap(bitmap, x, y, size, size);
if (bp != bitmap) {
bitmap.recycle();
}
Bitmap cansMap = Bitmap.createBitmap(size, size, bitmap.getConfig());
Canvas cav = new Canvas(cansMap);
Paint paint = new Paint();
/**
* Shader.TileMode:(一共有三种)
* CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色。
* REPEAT :横向和纵向的重复渲染器图片,平铺。
* MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。
* */
BitmapShader bShader = new BitmapShader(bp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(bShader);
paint.setAntiAlias(true);
float r = size / 2f;
cav.drawCircle(r, r, r, paint);
bp.recycle();
return cansMap;
}
@Override
public String key() {
return "";
}
};
Picasso.with(this).load(url).transform(transformation).error(R.mipmap.ic_launcher).into(image);
动态设置图片弧角:
class PicassoTransformation implements Transformation {
private final int radius;
private final int margin;
/**
* 第一个参数是弧度
* 第二个参数是图片缩放的比例
* */
public PicassoTransformation(final int radius, final int margin) {
this.radius = radius;
this.margin = margin;
}
@Override
public Bitmap transform(Bitmap source) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
BitmapShader bitmapShader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(bitmapShader);
Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
RectF rectF = new RectF(margin, margin, source.getWidth() - margin, source.getHeight() - margin);
canvas.drawRoundRect(rectF, radius, radius, paint);
if (source != output) {
source.recycle();
}
return output;
}
@Override
public String key() {
return "rounded(radius=" + radius + ", margin=" + margin + ")";
}
}
//调用
PicassoTransformation picassoTransformation = new PicassoTransformation(100,100);
Picasso.with(this).load(url).transform(picassoTransformation).error(R.mipmap.ic_launcher).into(image);