在官方文档中PorterDuffXferMode的效果是这样的
dst 是先绘制上去的,src是设置混合效果后绘制上去的,
然而有可能出来的效果是这样的
所以使用PorterDuffXferMode是要新建一个图层,才会有我们想要的效果的
代码如下
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);
//新建一个图层,新建的图层背景是透明的 int layerId = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null, Canvas.ALL_SAVE_FLAG); //把混合效果绘制在新的透明背景图层上
Paint paint = new Paint(); Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.mipmap.pink); canvas.drawBitmap(bitmap1,0,0,paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.blue); canvas.drawBitmap(bitmap,0,0,paint); paint.setXfermode(null);
//把绘制完成的图层绘制在原来的图层上 canvas.restoreToCount(layerId); }
这样便可得出正确的效果。
之前看到有帖子说必须绘制bitmap才有效果,其实不需要是bitmap也是可以的。 如下
int layer = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG); mClipPaint.setColor(getResources().getColor(R.color.white)); canvas.drawCircle(mRadius, mRadius,mRadius,mClipPaint); mRectF.set(0,0,getMeasuredWidth(),getMeasuredHeight()); //set mode为SRC_OUT 取两层的重合以外的部分 mClipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); canvas.drawRect(mRectF,mClipPaint); mClipPaint.setXfermode(null); canvas.restoreToCount(layer);绘制一个圆形和一个方形,取圆形区域镂空,照样是可以出效果的。