自分用のメモなので解説はないです。
RoundedCornersView.kt
import android.content.Context
import android.content.res.Resources
import android.graphics.Canvas
import android.graphics.Path
import android.graphics.RectF
import android.util.AttributeSet
import android.widget.FrameLayout
/**
* 角丸View.
*/
class RoundedCornersView(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) {
private val round = 5.toPx.toFloat()
private val path = Path()
init {
setWillNotDraw(false)
}
override fun onDraw(canvas: Canvas) {
path.addRoundRect(getRectF(canvas), round, round, Path.Direction.CW)
// StartTop, EndTopだけ角丸にする.
path.addRoundRect(getRectF(canvas), floatArrayOf(10f, 10f, 10f, 10f, 0f, 0f, 0f, 0f), Path.Direction.CW)
canvas.clipPath(path)
super.onDraw(canvas)
}
private fun getRectF(canvas: Canvas): RectF = RectF(canvas.clipBounds)
private val Int.toPx: Int
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
}