Picasso加载圆角图片

来源:互联网 发布:c语言是c 的基础吗 编辑:程序博客网 时间:2024/06/05 10:44
效果图:
11
Demo地址:http://download.csdn.net/download/baopengjian/9948840
1 目的:
对Picasso加载的图片进行处理,如实现圆角效果、裁剪效果等等

2. 原理
1)Picasso提供了一个加载前暴露对图片处理的方法transform() ,需要传入的参数为实现了Transformation的类
Picasso.with(context).load(stock.getUrl()).transform(new CropSquareTransformation()).into

2)利用Bitmap本身的API进行圆角处理,提供的工具类任意圆角都是可以的


3. 使用:
1)定义类实现Transformation接口
public static class CropSquareTransformation implements Transformation {
@Override public Bitmap transform(Bitmap source) {
int raduis = 20;
Bitmap output = BitmapFillet.fillet(source,raduis ,BitmapFillet.CORNER_TOP);
if(source !=null){
source.recycle();
}

return output;
}
@Override public String key() { return "roundcorner"; }
}

2) BitmapFillet.fillet是对Bitmap的处理
public class BitmapFillet {

public static final int CORNER_NONE = 0;
public static final int CORNER_TOP_LEFT = 1;
public static final int CORNER_TOP_RIGHT = 1 << 1;
public static final int CORNER_BOTTOM_LEFT = 1 << 2;
public static final int CORNER_BOTTOM_RIGHT = 1 << 3;
public static final int CORNER_ALL = CORNER_TOP_LEFT | CORNER_TOP_RIGHT | CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;
public static final int CORNER_TOP = CORNER_TOP_LEFT | CORNER_TOP_RIGHT;
public static final int CORNER_BOTTOM = CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;
public static final int CORNER_LEFT = CORNER_TOP_LEFT | CORNER_BOTTOM_LEFT;
public static final int CORNER_RIGHT = CORNER_TOP_RIGHT | CORNER_BOTTOM_RIGHT;



public static Bitmap fillet(Bitmap bitmap, int roundPx, int corners) {
try {
// 其原理就是:先建立一个与图片大小相同的透明的Bitmap画板
// 然后在画板上画出一个想要的形状的区域。
// 最后把源图片帖上。
final int width = bitmap.getWidth();
final int height = bitmap.getHeight();

Bitmap paintingBoard = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(paintingBoard);
canvas.drawARGB(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);

final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);

//画出4个圆角
final RectF rectF = new RectF(0, 0, width, height);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

//把不需要的圆角去掉
int notRoundedCorners = corners ^ CORNER_ALL;
if ((notRoundedCorners & CORNER_TOP_LEFT) != 0) {
clipTopLeft(canvas,paint,roundPx,width,height);
}
if ((notRoundedCorners & CORNER_TOP_RIGHT) != 0) {
clipTopRight(canvas, paint, roundPx, width, height);
}
if ((notRoundedCorners & CORNER_BOTTOM_LEFT) != 0) {
clipBottomLeft(canvas,paint,roundPx,width,height);
}
if ((notRoundedCorners & CORNER_BOTTOM_RIGHT) != 0) {
clipBottomRight(canvas, paint, roundPx, width, height);
}
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

//帖子图
final Rect src = new Rect(0, 0, width, height);
final Rect dst = src;
canvas.drawBitmap(bitmap, src, dst, paint);
return paintingBoard;
} catch (Exception exp) {
return bitmap;
}
}

private static void clipTopLeft(final Canvas canvas, final Paint paint, int offset, int width, int height) {
final Rect block = new Rect(0, 0, offset, offset);
canvas.drawRect(block, paint);
}

private static void clipTopRight(final Canvas canvas, final Paint paint, int offset, int width, int height) {
final Rect block = new Rect(width - offset, 0, width, offset);
canvas.drawRect(block, paint);
}

private static void clipBottomLeft(final Canvas canvas, final Paint paint, int offset, int width, int height) {
final Rect block = new Rect(0, height - offset, offset, height);
canvas.drawRect(block, paint);
}

private static void clipBottomRight(final Canvas canvas, final Paint paint, int offset, int width, int height) {
final Rect block = new Rect(width - offset, height - offset, width, height);
canvas.drawRect(block, paint);
}
}

3)使用
Picasso.with(context).load(stock.getUrl()).transform(new CropSquareTransformation()).into(iv_top);