Android(安卓)绘制圆形图片
16lz
2021-01-25
经常在项目中,会遇到使用圆形头像。然而图片往往不是圆形的,我们需要对图片进行处理,以达到圆形图片的效果。这里,我总结了一下常用的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:我们使用Xfermode的src_in模式,将原始图片和圆形进行重叠,得到重叠的圆形部分。
/** * 通过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着色器:给画笔设置着色器,最后使用这个画笔绘制圆形。
/** * 通过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,所以命名方面比较随意,请大家谅解。如果有什么错误的地方,请大家指正,不甚感激。
更多相关文章
- Android中仿微信选择图片并展示在RecyclerView中
- Android(安卓)Glide扩展实现图片加载进度条
- android 9.png图片详解
- Android(安卓)文本滚动效果的几种实现方式(二)
- android studio 使用.9图片
- RecyclerView如何实现滑动过程中暂停图片加载
- Android生成二维码--拍照或从相册选取图片
- 如何在android上 使用gif图片(android开源库android-gif-drawabl)
- 在Xamarin.Forms中使用SkiaSharp绘图时从原生工程中加载图片