Android关于AndroidQ取消canvas.clipPath(XX,XX)方法适配

在相当多的自定义View的绘制过程中多多少少会用到Canvas.clipPath方法,

  @Deprecated
    public boolean clipPath(@NonNull Path path, @NonNull Region.Op op) {
        checkValidClipOp(op);
        return nClipPath(mNativeCanvasWrapper, path.readOnlyNI(), op.nativeInt);
    }

其中的第二个参数Region.Op,AndroidQ已经取消了不建议使用了,其中只保留了INTERSECT和DIFFERENCE的处理,
在这里插入图片描述
在这里插入图片描述

具体参数如下:
在这里插入图片描述
举例:

PathA和PathB
 canvas.clipPath(pathA,);
 canvas.clipPath(pathB, Region.Op.INTERSECT);
Region.Op.DIFFERENCE :是PathA形状中不同于pathB的部分

Region.Op.REPLACE:显示PathB的形状

Region.Op.REVERSE_DIFFERENCE :显示PathB形状中不同于PathA的部分

Region.Op.INTERSECT:是PathA和PathB交集的形状

Region.Op.UNION:是PathA和PathB的全集

Region.Op.XOR:PathA和PathB的全集形状减去交集形状之后的部分

适配方法 采用Path.Op来处理
Path.Op和Region.Op的参数性质是一样的,都是这几个参数。
需要注意的一点是clipPath(path, Region.Op.INTERSECT);默认的是
Region.Op.INTERSECT两个Path的交集!

所以我么需要自己特殊的处理:

(我想实现的是ABC都在同一个屏幕, 裁剪出B区域中不同于与AC区域的部分,下面实现了AndroidQ和AndroidQ以下的实现方式)


pathA = new Path();
pathB = new Path();
pathC = new Path();
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
 //创建一个PathA和PathC的合集
 		   pathC.op(pathA,Path.Op.UNION);//此时pathC就是PathA和PathC的合集
		   pathB.op(pathC,Path.Op.XOR); //创建一个PathB和(PathA和PathC合集)的Op.XOR
           canvas.clipPath(pathB); //因为canvas。clipPath的默认是INTERSECT所以 最终绘制的是Path.Op.REVERSE_DIFFERENCE
}else{
        //AndroidQ以下的实现
            canvas.clipPath(pathA);//裁剪出A区域
            canvas.clipPath(getPathC(), Region.Op.UNION);//裁剪出A和C区域的全集
            canvas.clipPath(getPathB(), Region.Op.REVERSE_DIFFERENCE);//裁剪出B区域中不同于与AC区域的部分
 }

上面用到了pathC.op(pathA,Path.Op.UNION); 举个例子如果
C.op(A,Path.Op.UNION) 说明C和A的合计赋值给了C,之后可以用C来操作下一步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值