该方法用于裁剪画布,也就是设置画布显示的区域。
调用clipRect()方法后,只会显示被裁剪的区域,之外的区域不会显示。
canvas.clipRect(rect: RectF, op: Region.Op), 有两个参数。
第一个参数为裁剪的矩形区域。第二个参数为裁剪区域的类型(默认为Region.Op.INTERSECT)。
Region.Op参数的意义:
比如有两个图形A和B
- DIFFERENCE 现实图形B之外的区域。
- REVERSE_DIFFERENCE
- UNION
- REPLACE
- XOR
下面的demo,通过canvas.clipRect()实现裁剪框。代码如下:
class OverlayView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val mCropViewRect = RectF()
private val mTempRect = RectF()
private var mThisWidth = 0
private var mThisHeight = 0
//裁剪区域矩形画笔
private val mClipPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.parseColor("#AAFAFF00")
strokeWidth = resources.getDimensionPixelSize(R.dimen.stroke_width).toFloat()
style = Paint.Style.STROKE
}
//红色画笔
private val mPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.parseColor("#ff0000")
strokeWidth = resources.getDimensionPixelSize(R.dimen.stroke_width).toFloat()
style = Paint.Style.STROKE
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
if (changed) {
val pleft = paddingLeft
val ptop = paddingTop
val pright = width - paddingRight
val pbottom = height - paddingBottom
mThisWidth = pright - pleft
mThisHeight = pbottom - ptop
setupCropBounds()
}
}
/**
* 设置裁剪框的大小
*/
private fun setupCropBounds() {
val height = mThisWidth
val halfDiff = (mThisHeight - height) / 2
mCropViewRect.set(
paddingLeft.toFloat(), (paddingTop + halfDiff).toFloat(),
(paddingLeft + mThisWidth).toFloat(), (paddingTop + height + halfDiff).toFloat()
)
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.let {
drawCropGrid(it)
}
}
private fun drawCropGrid(canvas: Canvas) {
val pRectF = RectF(mCropViewRect).apply {
top = mCropViewRect.top + 5
left = mCropViewRect.left + 5
right = mCropViewRect.right - 5
bottom = mCropViewRect.bottom - 5
}
canvas.save()
val colorRectF = RectF(pRectF)
canvas.clipRect(colorRectF, Region.Op.DIFFERENCE)
canvas.drawColor(Color.parseColor("#AA000000"))
canvas.restore()
canvas.drawRect(pRectF, mClipPaint)
canvas.save()
//裁剪rect
with(mTempRect) {
set(mCropViewRect)
inset(-40f, 40f)
}
canvas.clipRect(mTempRect, Region.Op.DIFFERENCE)
with(mTempRect) {
set(mCropViewRect)
inset(40f, -40f)
}
canvas.clipRect(mTempRect, Region.Op.DIFFERENCE)
// canvas.drawRect(mTempRect, mClipPaint)
canvas.drawRect(mCropViewRect, mPaint)
canvas.restore()
}
}
效果图如下: