自定义圆形时钟

自定义ClockView


 效果图:


自定义View
public class ClockView extends View {
    private float cx;
    private float cy;
    private int radius;
    private Paint paint;

    public ClockView(Context context) {
        this(context, null);
    }

    public ClockView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 对View进行绘制
     * @param canvas 画布对象
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //初始化参数
        cx = getWidth() / 2f;
        cy = getHeight() / 2f;
        radius = Math.min(getWidth(), getHeight()) / 2 - 10;
        paint = new Paint();

        //绘制表盘
        paint.setColor(Color.BLACK);//画笔的颜色
        paint.setStrokeWidth(5);//画笔粗细
        paint.setStyle(Paint.Style.STROKE);//空心画笔
        canvas.drawCircle(cx, cy, radius, paint);

        //绘制圆心
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);
        canvas.drawCircle(cx, cy, radius / 10, paint);


        //拿到当前时间
        int hour = Calendar.getInstance().get(Calendar.HOUR);
        int minute = Calendar.getInstance().get(Calendar.MINUTE);
        int second = Calendar.getInstance().get(Calendar.SECOND);
        float fhour = Calendar.getInstance().get(Calendar.HOUR) + minute / 60f;

        //绘制指针
        paint.setStrokeWidth(20);
        paint.setColor(Color.RED);
        paint.setStrokeCap(Paint.Cap.ROUND);
        canvas.drawLine(cx, cy, (float) (cx + radius * 0.5 * Math.sin(Math.toRadians(fhour * 30))),
                (float) (cy - (radius * 0.5 * Math.cos(Math.toRadians(fhour * 30)))), paint);

        paint.setStrokeWidth(10);
        paint.setColor(Color.BLUE);
        canvas.drawLine(cx, cy, (float) (cx + radius * 0.6 * Math.sin(Math.toRadians(minute * 6))),
                (float) (cy - (radius * 0.6 * Math.cos(Math.toRadians(minute * 6)))), paint);

        paint.setStrokeWidth(5);
        paint.setColor(Color.GREEN);
        canvas.drawLine(cx, cy, (float) (cx + radius * 0.7 * Math.sin(Math.toRadians(second * 6))),
                (float) (cy - (radius * 0.7 * Math.cos(Math.toRadians(second * 6)))), paint);

        //绘制数字
        paint.setTextSize(50);
        paint.setColor(Color.BLACK);
        for (int i = 1; i < 13; i++) {
            float tx = paint.measureText(i + "") / 2;
            canvas.drawText(i + "", (float) (cx + radius * 0.85 * Math.sin(Math.toRadians(i * 30))) - tx,
                    (float) (cy - (radius * 0.85 * Math.cos(Math.toRadians(i * 30)))) + 20, paint);
        }

        //每秒刷新一次
        postInvalidateDelayed(1000);//1000毫秒后调onDraw()刷新自己
    }
}

有兴趣的朋友可以试试。觉得不错就请点个赞。谢谢...



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值