Android – 使用画布在背景颜色之外设置背景颜色

我正在研究Camera Activity Overlay,我已经成功地在矩形外部(不透明的黑色)创建了不透明的颜色。 而且我已经成功地在大矩形内创建了一个小矩形。 请看下面的图片。 正如你所看到的,小矩形上有一个蓝色的背景。 问题是,我想要在图像(位图)之外制作蓝色背景,而不是覆盖图像。 问题是,如果我用透明填充来改变图像,那么蓝色的背景将会覆盖全部。 我怎样才能使蓝色背景只覆盖图像的外部? 我已经试图从谷歌找到所有可能的答案,但对我来说没有运气,也许我开始用错误的方法,需要咨询。

在这里输入图像描述

这是我的代码

bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas osCanvas = new Canvas(bitmap); RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight()); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(getResources().getColor(R.color.opaque_black)); paint.setAlpha(99); osCanvas.drawRect(outerRectangle, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); paint.setColor(Color.TRANSPARENT); paint.setStyle(Paint.Style.FILL); RectF r1 = new RectF( (float) (xStartingPoint), (float) (yStartingPoint), (float) (parentWidth), (float) (parentHeight)); osCanvas.drawRoundRect(r1, (float) (cornerRadiusRatio * parentHeight), (float) (cornerRadiusRatio * parentHeight), paint); paint.setStrokeWidth(strokeWidth); paint.setColor(getResources().getColor(R.color.colorDeepSky)); paint.setStyle(Paint.Style.STROKE); RectF r2 = new RectF( (float) (xStartingPoint), (float) (yStartingPoint), (float) (parentWidth), (float) (parentHeight)); osCanvas.drawRoundRect(r2, (float) (cornerRadiusRatio * parentHeight), (float) (cornerRadiusRatio * parentHeight), paint); if (callbackMsg.equals(AppConstant.KTP_SELF)) { paint.setColor(getResources().getColor(R.color.colorDeepSky)); drawRect(osCanvas, paint, (float) (xChildStartingPoint), (float) (yChildStartingPoint), (float) (childWidth + xChildStartingPoint + 0.3 * childWidth), (float) (childHeight + 0.7 * yChildStartingPoint)); } RectF outerRectangle2 = new RectF( (float) xChildStartingPoint, (float) yChildStartingPoint, (float) (childWidth + xChildStartingPoint + 0.3 * childWidth), (float) (childHeight + 0.7 * yChildStartingPoint)); Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG); paint2.setColor(getResources().getColor(R.color.blue)); paint2.setAlpha(99); osCanvas.drawRect(outerRectangle2, paint2); Rect r3 = new Rect( (int) (xChildStartingPoint), (int) (yChildStartingPoint), (int) (childWidth + xChildStartingPoint + 0.3 * childWidth), (int) (childHeight + 0.7 * yChildStartingPoint)); paint2 = new Paint(Paint.ANTI_ALIAS_FLAG); paint2.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); paint2.setColor(Color.TRANSPARENT); paint2.setStyle(Paint.Style.FILL); Bitmap mbitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_profile2); osCanvas.drawBitmap(mbitmap, null, r3, paint2); 

谢谢

好的,找到答案

我用DST_OUT模式使用PorterDuff

注意:如果要使图像背景透明且外部区域填充颜色,请使用DST_OUT如果要使外部区域填充颜色,请使用DST_IN

这是代码,即时通讯使用Kotlin

  var paint2 = Paint(Paint.ANTI_ALIAS_FLAG) paint2.color = resources.getColor(R.color.opaque_black) osCanvas.drawRect(outerRectangle2, paint2) paint2 = Paint(Paint.ANTI_ALIAS_FLAG) val r3 = Rect( xChildStartingPoint.toInt(), yChildStartingPoint.toInt(), (childWidth + xChildStartingPoint + 0.3 * childWidth).toInt(), (childHeight + 0.7 * yChildStartingPoint).toInt()) paint2.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_IN) val mBitmap = BitmapFactory.decodeResource(resources, R.drawable.selfie_outline) osCanvas.drawBitmap(mBitmap, null, r3, paint2)