BookPage
BookPage copied to clipboard
Region.Op限制
谷歌在高版本的系统上禁止使用Region.Op除DIFFERENCE,INTERSECT外的裁减,怎么解决
在高版本上用
path1.op(path2, Path.Op.REVERSE_DIFFERENCE);
canvas.clipPath(path1);
来替代类似于
canvas.clipPath(path1);
canvas.clipPath(path2, Region.Op.REVERSE_DIFFERENCE);
这样的实现
@FhrShadow 确定能用?我这边怎么试还是空白一片,B和C区都绘画不出来
已解决问题,谢谢,是我理解有点错误
@LiDevil 你好,请问这个问题是怎么解决的啊?我现在是C绘制不出来,不是空白,而是黑色一片,
我裁剪C的逻辑是: canvas.clipPath(getPathB());//裁剪出PathB canvas.clipPath(pathA, Region.Op.DIFFERENCE);//裁剪出PathB中不同于PathA的区域,也就是区域B和区域C canvas.clipPath(getPathC(), Region.Op.INTERSECT);//裁剪出区域B和区域C中和PathC相同的区域,也就是区域C
已解决问题,忘记把pathCPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP));这局代码注释掉了
关于在高版本 SDK 28 上 Region.Op 限制导致程序奔溃,以下是修复代码
`
/** * 绘制B区域内容 * * @param canvas * @param pathA */ private void drawPathBContent(Canvas canvas, Path pathA) { canvas.save(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { pathA.op(getPathC(), Path.Op.UNION);//裁剪出A和C区域的全集 pathA.op(getPathB(), Path.Op.REVERSE_DIFFERENCE);//裁剪出B区域中不同于与AC区域的部分 canvas.clipPath(pathA); } else { canvas.clipPath(pathA);//裁剪出A区域 canvas.clipPath(getPathC(), Region.Op.UNION);//裁剪出A和C区域的全集 canvas.clipPath(getPathB(), Region.Op.REVERSE_DIFFERENCE);//裁剪出B区域中不同于与AC区域的部分 } drawPathBShadow(canvas); canvas.restore(); }
`
` /** * 绘制C区域内容 * * @param canvas * @param pathA */ private void drawPathCContent(Canvas canvas, Path pathA) { canvas.save();
//裁剪出C区域不同于A区域的部分
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
pathA.op(getPathC(), Path.Op.REVERSE_DIFFERENCE);
canvas.clipPath(pathA);
} else {
canvas.clipPath(pathA);
canvas.clipPath(getPathC(), Region.Op.REVERSE_DIFFERENCE);
}
以下代码过长已忽略.... `