Android透明的各种形状的view的写法

683 阅读2分钟

我前面写了一片布局透明形状的view的做法,但是那几种方法都有缺陷。 下面给大家介绍一种强力的无缺陷的方法。

我不知道目前大家的项目的minSdkVersion是多少,但是我的一直是14,最近有些变化成16,我的项目的适配很广了。

有网友认为取path差集的方法是最快的简单,这个我倒是不认同啊,还有就是他的最低api的要求是19。我的是14或16,如果要适配api19以下的怎么办?

下面经过我的研究,可以完美的适配到我的api要求。目前我还没看到网上又说这种方法的,至少我没看到。

好了话不多说,看下面的代码,有兴趣的同学可以按下面的方法自己试试。

1.png2.png

适合所有的形状哦,不限于圆形

定义画笔

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,目前我测试没有发现问题,我这边的测试机器不算多,如果发现问题的同学可以发个评论给我,如果觉得好,别忘了点赞,在此多谢了。