在相当多的自定义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来操作下一步