canvas 中的多个剪辑区域?
Multiple clipping regions in canvas?
我想剪辑图像的多个区域,
所以我有一个自定义 class 扩展 ImageView
这是我的onDraw:
@Override
protected void onDraw(Canvas canvas) {
canvas.clipRect(rect1);
canvas.clipRect(rect2);
super.onDraw(canvas);
}
当我剪辑 1 个矩形时它工作正常,但是当我有多个时它根本不显示任何东西。
更新:
我也尝试过使用 Path 进行裁剪:
@Override
protected void onDraw(Canvas canvas) {
canvas.clipPath(path1);
canvas.clipPath(path2);
super.onDraw(canvas);
}
但是none有效
它将在您的矩形中交叉或替换。
尝试改用 clipPath(...)。
即
Path p1 = ...;
Path p2 = ...;
p2.addPath(p1);
canvas.clipRect(p2);
如果由于某种原因 clipPath 不起作用,则构建一个区域并使用 clipRegion。
编辑:
根据OP的最终解决方案,也可以在添加剪辑区域时合并区域:
canvas.clip{whatever}(rect/region/path, op).
我找到了解决方案,它使用的是:
canvas.clipPath(Path path, Op op);
而不是:
canvas.clipPath(Path path);
带有额外剪辑,这也适用于 Rect
和 Region
。
我的代码是这样的:
Path path1 = new Path();
private void init(){
path1.moveTo(100, 100);
path1.lineTo(100, 500);
path1.lineTo(500, 500);
path1.lineTo(500, 100);
path1.close();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.clipPath(path1);
canvas.clipPath(path2, Region.Op.UNION);
canvas.clipPath(path3, Region.Op.UNION);
super.onDraw(canvas);
}
我想剪辑图像的多个区域,
所以我有一个自定义 class 扩展 ImageView
这是我的onDraw:
@Override
protected void onDraw(Canvas canvas) {
canvas.clipRect(rect1);
canvas.clipRect(rect2);
super.onDraw(canvas);
}
当我剪辑 1 个矩形时它工作正常,但是当我有多个时它根本不显示任何东西。
更新:
我也尝试过使用 Path 进行裁剪:
@Override
protected void onDraw(Canvas canvas) {
canvas.clipPath(path1);
canvas.clipPath(path2);
super.onDraw(canvas);
}
但是none有效
它将在您的矩形中交叉或替换。
尝试改用 clipPath(...)。
即
Path p1 = ...;
Path p2 = ...;
p2.addPath(p1);
canvas.clipRect(p2);
如果由于某种原因 clipPath 不起作用,则构建一个区域并使用 clipRegion。
编辑:
根据OP的最终解决方案,也可以在添加剪辑区域时合并区域:
canvas.clip{whatever}(rect/region/path, op).
我找到了解决方案,它使用的是:
canvas.clipPath(Path path, Op op);
而不是:
canvas.clipPath(Path path);
带有额外剪辑,这也适用于 Rect
和 Region
。
我的代码是这样的:
Path path1 = new Path();
private void init(){
path1.moveTo(100, 100);
path1.lineTo(100, 500);
path1.lineTo(500, 500);
path1.lineTo(500, 100);
path1.close();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.clipPath(path1);
canvas.clipPath(path2, Region.Op.UNION);
canvas.clipPath(path3, Region.Op.UNION);
super.onDraw(canvas);
}