Region.Op

不同模式合成的效果:
A:表示第一个裁剪的形状 - 矩形;
B:表示第二次裁剪的形状 - 圆形;

Region.Op.DIFFERENCE :是A形状中不同于B的部分显示出来
Region.Op.REPLACE:是只显示B的形状
Region.Op.REVERSE_DIFFERENCE :是B形状中不同于A的部分显示出来,这是没有设置时候默认的
Region.Op.INTERSECT:是A和B交集的形状
Region.Op.UNION:是A和B的全集
Region.Op.XOR:是全集形状减去交集形状之后的部分
具体使用:
class LiveCover(context: Context, attrs: AttributeSet?) : View(context, attrs) {
var clipRect = RectF()
var clipPath = Path()
var roundCornerSize = 0f
var clipRectLeft = 0f
var clipRectTop = 0f
var clipRectWidth = 0f
var clipRectHeight = 0f
var screenWidth = 0
var screenHeight = 0
var pptWidth = 0
var pptHeight = 0
//计算适配课件区域位置。
init {
screenWidth = DensityUtils.getScreenWidth(context)
screenHeight = DensityUtils.getScreenHeight(context)
pptHeight = LIVE_PPT_TEACHER_HEIGHT * screenHeight / LIVIE_TEACHER_HEIGHT_BASE
pptWidth = pptHeight * 16 / 9
roundCornerSize = DensityUtils.dpToPx(context, 20f).toFloat()
clipRectLeft = (screenWidth / 2 - pptWidth / 2).toFloat()
clipRectTop = (LIVE_PPT_TEACHER_TOP * screenHeight / LIVIE_TEACHER_HEIGHT_BASE).toFloat()
clipRectWidth = clipRectLeft + pptWidth
clipRectHeight = clipRectTop + pptHeight
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
clipRect.left = clipRectLeft
clipRect.top = clipRectTop
clipRect.right = clipRectWidth
clipRect.bottom = clipRectHeight
clipPath.addRoundRect(clipRect, roundCornerSize, roundCornerSize, Path.Direction.CW)
canvas?.clipPath(clipPath, Region.Op.DIFFERENCE)
canvas?.drawColor(0xff1E1A33.toInt())
// canvas?.drawColor(Color.RED)
}
}
通过clipRect/clippath等来进行剪裁,上下层画布可以拼接成不同的图案效果,来合成绘制到view上。
那么画布剪裁漏了,view就能漏了么?是的,为什么呢?
Canvas和View的关系?
view可以当做是容器屏幕显示的效果
canvas可以看作是一个透明的图层,我们每次调用canvas的draw...方法都会产生一个透明的层

这个图层是无限大的,超出屏幕部分不可见而已。
translate(dx,dy) 和 scale等都是操作画布的,
网友评论