我前面写了一片布局透明形状的view的做法,但是那几种方法都有缺陷。
下面给大家介绍一种强力的无缺陷的方法。
我不知道目前大家的项目的minSdkVersion
是多少,但是我的一直是14,最近有些变化成16,我的项目的适配很广了。
有网友认为取path差集的方法是最快的简单,这个我倒是不认同啊,还有就是他的最低api的要求是19。我的是14或16,如果要适配api19以下的怎么办?
下面经过我的研究,可以完美的适配到我的api要求。目前我还没看到网上又说这种方法的,至少我没看到。
好了话不多说,看下面的代码,有兴趣的同学可以按下面的方法自己试试。
适合所有的形状哦,不限于圆形
定义画笔
val mViewPaint = Paint()
mViewPaint.isAntiAlias = true
mViewPaint.style = Paint.Style.FILL
复制代码
利用path开画
其余部分填充,留下圆形区域
val path = Path()
path.moveTo(0F, 0F)//当前view的起点,左上角
path.lineTo(width.toFloat(), 0F)//当前view的右上角
path.lineTo(width.toFloat(), height.toFloat())//当前view的右下角
path.lineTo(0F, height.toFloat())//当前view的左下角
path.addCircle(
x.toFloat(),
y.toFloat(),
radius.toFloat(),
Path.Direction.CCW //这里很重要哦
)//加上你要画的形状和区域
canvas?.drawPath(path, mViewPaint)
复制代码
或者
path.addCircle(
x.toFloat(),
y.toFloat(),
radius.toFloat(),
Path.Direction.CW //这里很重要哦
)//加上你要画的形状和区域
path.fillType = Path.FillType.WINDING
path.toggleInverseFillType()//反向填充
canvas?.drawPath(path, mViewPaint)
复制代码
其余部分填充,留下圆角矩形区域
val rectF = RectF(0F, 0F, width.toFloat(), height.toFloat())
val path = Path()
path.moveTo(0F, 0F)
path.lineTo(width.toFloat(), 0F)
path.lineTo(width.toFloat(), height.toFloat())
path.lineTo(0F, height.toFloat())
path.addRoundRect(rectF, mCornersX, mCornersY, Path.Direction.CCW)
canvas?.drawPath(path, mViewPaint)
复制代码
或者
path.addRoundRect(rectF, mCornersX, mCornersY, Path.Direction.CW)
path.fillType = Path.FillType.WINDING//这句不加的话,在手机黑屏重新打开图形会变化
path.toggleInverseFillType()//反向填充
canvas?.drawPath(path, mViewPaint)
复制代码
这么写适合14以上的api,目前我测试没有发现问题,我这边的测试机器不算多,如果发现问题的同学可以发个评论给我,如果觉得好,别忘了点赞,在此多谢了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END