在网上找了一下,最简单的是利用canvas的setXfermode,来控制图片重合部分的显示策略。
图片混合时,先画的是dst,后画的是src,各种混合的方式如下,其中圆形是dst,正方形是src:
不过网上的一些做法没有考虑到图片为长方形的情况,下面给出我修正后的做法:
这里我们采用srcin模式,先画透明的圆形即dst,再画原图即src,两个重叠的部分就是我们需要的圆形图了(dstin也可以,就是先画原图,再画透明的圆形)。
就是先判断宽和高中最大max、最小min,只创建半径为min的透明圆,然后画原图时移到中心去,只画一部分。
public static Bitmap toCircleBitmap(Bitmap bitmap) { int min = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getHeight() : bitmap.getWidth(); int max = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getWidth() : bitmap.getHeight(); Bitmap output = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); Paint paint = new Paint(); RectF rectF = new RectF(0, 0, min, min); canvas.drawOval(rectF, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); if (min == bitmap.getWidth()) { canvas.drawBitmap(bitmap, 0, (min - max) / 2, paint); } else { canvas.drawBitmap(bitmap, (min - max) / 2, 0, paint); } return output; }
对于画圆角,可以用drawRoundRect(rectF, 15, 15, paint); 替代drawOval。
时间: 2024-10-06 16:44:41