IOS的Switch是这样的,Android设计上有些不同

设计思路
1.组成:一个左右移动的圆圈(带边框)+背景圆角矩形(分为两种情况:1.全覆盖选中颜色的圆角矩形 2. 带边框的空白圆角矩形)。
2.带边框的圆角矩形:左右移动没什么难度,大圆小圆叠加,移动圆心就行。
3.背景圆角矩形:gif慢慢分析,可以分为三层圆角矩形来完成,最底层是一个灰色的大圆角矩形(不变,充当边框),中间层是一个可以放大缩小的中等圆角矩形(可以变化大小),最上层是一个中等绿色圆角矩形(可以变化透明度)。
考察点
Canvas.save Canvas.resotre
Canvas的平移,缩放,旋转会对后续的绘制影响
看下代码
protected void onDraw(Canvas canvas) {
if (big_rectF == null) {
big_rectF = new RectF(3, 3, getWidth() - 3, getHeight() - 3);
small_rectF = new RectF(4, 4, getWidth() - 4, getHeight() - 4);
}
// 底圆
canvas.drawRoundRect(big_rectF, (getHeight() - 6) / 2, (getHeight() - 6
) / 2, big_graay_paint);
// 需要放大缩小的背景
canvas.save();
canvas.scale(scale, scale, getWidth() / 2, getHeight() / 2);
canvas.drawRoundRect(small_rectF, (getHeight() - 10) / 2, (getHeight() - 10) / 2, change_paint);
canvas.restore();
// 画一个圆角长方形 这个只变化透明度
canvas.drawRoundRect(small_rectF, (getHeight() - 8) / 2, (getHeight() - 8) / 2, bg_paint);
// 带边框的圆 两个圆组合
canvas.drawCircle(getHeight() / 2 + x, getHeight() / 2, (getHeight() - 16) / 2, circle_big_paint);
canvas.drawCircle(getHeight() / 2 + x, getHeight() / 2, (getHeight() - 20) / 2, circle_small_paint);
}
效果
