关于PorterDuffXferMode效果出不来的问题

在官方文档中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);
绘制一个圆形和一个方形,取圆形区域镂空,照样是可以出效果的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闽农qq:994955138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值