在实现用户头像等需求的时候会用到圆形图片的处理方法,在Android中没有直接提供圆形图片的控件则需要使用自定义控件实现圆形图片的实现。
原理:主要使用SRC_IN这种模式来实现图片的圆形效果。首先说一下SRC_IN的原理,PorterDuff.Mode一共有16种模式,SRC_IN是其中的一种,它是将Dst图片与SRC图片重叠获得重叠的部分显示的是SRC部分。也就是说首先使用它来实现圆形图片的效果我们只要关心两个图片的draw的先后顺序,先画圆使用SRC_IN再画图片就可以得到原型图片。画边线即为在图片外绘制一个带边线的空心圆。
下面是实现圆形图片的核心代码:
/**
* 根据原图和变长绘制圆形图片
*
* @param source
* @param min
* @return
*/
private Bitmap createCircleImage(Bitmap source, int min)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN,参考上面的说明
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
下面是一张PorterDuff.Mode16种模式的示意图,可以根据需求进行选择使用
画边线的核心代码:
/**
* 边缘画圆
*/
private void drawCircleBorder(Canvas canvas, int radius, int color) {
Paint paint = new Paint();
/* 去锯齿 */
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(color);
/* 设置paint的 style 为STROKE:空心 */
paint.setStyle(Paint.Style.STROKE);
/* 设置paint的外框宽度 */
paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
}
绘制图片圆角的效果使用的原理与圆形图片相同,只是他首先绘制的是圆角,下面为核心代码:
/**
* 根据原图添加圆角
*
* @param source
* @return
*/
private Bitmap createRoundConerImage(Bitmap source)
{
final Paint paint = new Paint();
paint.setAn