好久没有更新啦!最近要来一波更新啦! 之前在忙的项目告一段落,这里总结一下。
圆形的背景,就像这样:
我的思路是在RelativeLayout的底部,画一个白色的“凹”弧。上面红色部分就是正常的RelativeLayout的背景,我这里使用的背景色,你也可以使用背景图片,drawable啥的。其他和普通的RelativeLayout的用法一样,可以在里面随意的布局。
看到画弧线,就知道肯定要用到贝赛尔曲线啦! 我选了5个点,组成了一个Path,然后使用白色的画笔进行了填充。
下面是代码,大约30行,稍纵即逝……
package com.greendami.widget
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.util.AttributeSet
import android.widget.RelativeLayout
class PPRoundLayout(context: Context?, attrs: AttributeSet? = null) : RelativeLayout(context, attrs) {
override fun dispatchDraw(canvas: Canvas) {
val mPath = Path()
mPath.moveTo(0f, height.toFloat())
mPath.lineTo(width.toFloat(), height.toFloat())
mPath.lineTo(width.toFloat(), height * 0.6f)
//绘制贝塞尔曲线
mPath.quadTo(width / 2f, height.toFloat(), 0f, height * 0.6f)
mPath.lineTo(0f, height.toFloat())
mPath.close()
val paint = Paint()
paint.isAntiAlias = true
paint.color = Color.WHITE
val saveCount = canvas.saveLayer(0f, 0f, width.toFloat(), height.toFloat(), null, Canvas.ALL_SAVE_FLAG)
canvas.drawPath(mPath, paint)
canvas.restoreToCount(saveCount)
super.dispatchDraw(canvas)
}
}
虽然代码很短,但是我还是想说说为什么这样做。 我尝试过剪裁出一个底部是圆弧的View,然后使用这个View当背景。但是效果不好,圆弧有明显的锯齿。 我想直接画一个弧的部分:就像蓝色框框里面的部分: