经常在项目中,会遇到使用圆形头像。然而图片往往不是圆形的,我们需要对图片进行处理,以达到圆形图片的效果。这里,我总结了一下常用的android圆形图片的绘制的方法。主要有以下几种方式:1.画布裁剪;2.Xfermode进行重叠;3使用着色器shader。下面我们将一个一个进行描述:
第一种,画布裁剪:通过创建空白的Bitmap生成canvas画布,然后将画布进行裁剪成圆形,最后在画布上进行绘制。见代码:
/** * 通过裁剪画布 * * @param bitmap * @return */ public static Bitmap clipDrawable(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int min = Math.min(width, height); //通过新建一个Bitmap创建一个画布 Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bp); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLACK); //创建圆形路径,用于画布裁剪 Path path = new Path(); path.addCircle(min / 2, min / 2, min / 2, Path.Direction.CCW); canvas.clipPath(path); //在裁剪后的画布上进行绘制 canvas.drawBitmap(bitmap, -width / 2 + min / 2, -height / 2 + min / 2, paint); return bp; }
/** * 通过Xfermode * * @param bitmap * @return */ public static Bitmap getCircleBitmap(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int min = Math.min(width, height); //通过新建一个Bitmap创建一个画布 Bitmap bp = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.GRAY); Canvas canvas = new Canvas(bp); canvas.drawCircle(min / 2, min / 2, min / 2, paint); //设置模式为取重叠的部分 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); // paint.setColorFilter(new LightingColorFilter(0xFFFFFF00, 0x00000000)); // canvas.drawBitmap(bitmap, min / 2 - width / 2, min / 2 - height / 2, paint); canvas.drawBitmap(bitmap, null, new Rect(min / 2 - width / 2, min / 2 - height / 2, width / 2 + min / 2, height / 2 + min / 2), paint); return bp; }
/** * 通过shader */ public static Bitmap getShaderBitmap(Bitmap bitmap) { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.GRAY); //设置着色器 paint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); int width = bitmap.getWidth(); int height = bitmap.getHeight(); int r = Math.min(width, height) / 2; Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bp); //在圆形中进行着色 canvas.drawCircle(width/2, height/2, r, paint); return bp; }
总体来说,绘制的方法大致如上所述,大家可以针对自己的需求进行修改。上面的代码写的demo,所以命名方面比较随意,请大家谅解。如果有什么错误的地方,请大家指正,不甚感激。