项目中通常会遇到一个需求,根据开关来判断当前业务是否使用,那么就需要用到一个开关按钮。
如果需要自己定义的话,怎么实现呢?
我们要实现一个东西,就得一步一步来,这样思路就比较清晰,遇到问题也就可以一步一步去解决。
我们把这个按钮分为几部分,一个蓝色背景,一个白色的圆。然后点击后背景变为红色,然后圆移动到右边。这就是这个view的组成部分。那么怎么实现呢?
首选我们得确定这个view的大小。所以就需要对它的onMeasure方法重写。这个控件是写在xml中的,所以它的大小就已经确定了。那么onMeasure就好处理了
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
width = MeasureSpec.getSize(widthMeasureSpec)
height = MeasureSpec.getSize(heightMeasureSpec)
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)
}
获取xml中的大小。大小确定后,那么就开始我们最终的环节,绘制!!!!!
背景看着像一个矩形带着弧度。那么就看Canvas是否有这样的api,答案是有的drawRoundRect,
val center = (height / 2).toFloat()
// 设置我们的矩形大小,宽和高就是我们从xml中获取得宽和高
rectF.set(0f, 0f, width.toFloat(), height.toFloat())
// 100 就是矩形弧度
canvas.drawRoundRect(rectF, 100f, 100f, paint)
canvas.save()
// 经过这个步骤就能实现我们蓝色得背景
那么接下来就是绘制我们得圆,圆形是好绘制,但是怎么确定它的位置呢?(就是这种运算所以我对自定义view不是很熟练)我们直接看代码
// 必须先移动画布在绘制
// isOpen是用来处理打开和关闭是圆移动的距离
// center就是我们圆的半径,当往右移动的时候距离就是我们的一个宽度减去我们圆的直径,就能达到红色背景图的效果
var tr = if (isOpen) width.toFloat() - center * 2 else 0f
canvas.translate(tr, 0f)
paint.color = Color.WHITE
// 绘制我们的圆,半径减去5 是为了留点空隙。
// 第一个参数和第二个参数 合起来表示圆心起点位置 再加上第三个参数 起点位置以center - 5半径开始绘制圆
canvas.drawCircle(
center, center, center - 5, paint
)
起点位置
最终效果