Andoid鬼点子 近期项目总结(1) 圆弧背景

236 阅读1分钟

好久没有更新啦!最近要来一波更新啦! 之前在忙的项目告一段落,这里总结一下。

圆形的背景,就像这样:

图1.png
原图来自 或者这样:

图2.png

我的思路是在RelativeLayout的底部,画一个白色的“凹”弧。上面红色部分就是正常的RelativeLayout的背景,我这里使用的背景色,你也可以使用背景图片,drawable啥的。其他和普通的RelativeLayout的用法一样,可以在里面随意的布局。

看到画弧线,就知道肯定要用到贝赛尔曲线啦! 我选了5个点,组成了一个Path,然后使用白色的画笔进行了填充。

图3.png

下面是代码,大约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当背景。但是效果不好,圆弧有明显的锯齿。 我想直接画一个弧的部分:就像蓝色框框里面的部分:

图4.png
但是我需要有控件的位置会侵入到这个圆弧的里面。所以这个方式也不适合。