Android canvas画布裁剪canvas.clipRect()的作用

该方法用于裁剪画布,也就是设置画布显示的区域。
调用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()

    }

}

效果图如下:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值