自定义View学习-Android仿IOS SwitchButton

914 阅读1分钟

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

为了样式尽可能相同,Android上需要自己自定义View实现。

设计思路

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);
    }

效果

代码地址github.com/pj0579/Andr…