时钟窗口小部件实现

前言

Android自带的时钟AppWidget感觉特别的简单,只有一个圆盘加上时针和分针,看着也没有什么变化,这里就自己来实现一下简单的时钟小部件。

实现效果

这里写图片描述

时钟控件实现

时钟控件最外层的大圆只可以调用Canvas.drawCircle实现,这个很简单,事实上canvas对象除了那些直接画线、画圆等画图操作外,它还能够像真正的画布那样做各种移位、旋转等动作,为了保证这些操作不会影响其他元素的绘制,通常会先保存画布内容在做移位旋转等操作,最后在还原画布内容。了解了这些之后就可以轻松的绘制内部的刻度线了,圆形最上方的12点钟刻度线位置很容易确定,如果直接绘制12点前后的刻度需要用三角函数计算它们的位置,这样太麻烦了,可以旋转画布360 / (12 * 60)也就是每个最小刻度之间的角度值,然后再绘制,不停的旋转直到所有的刻度都画完,时钟的时间文案也是用同样的方式绘制。

 private void drawClock(Canvas canvas) {
    paint.setStrokeWidth(CommonUtils.dp2px(1));
    paint.setStyle(Paint.Style.STROKE);
    paint.setTextSize(CommonUtils.dp2px(13));
    int centerX = width / 2;
    int centerY = height / 2;
    canvas.save();
    canvas.drawCircle(centerX, centerY, centerX - CommonUtils.dp2px(5), paint);
    for (int i = 0; i < MINUTES_COUNT; i++) {
        if (i % 5 == 0) { // 画时
            canvas.drawLine(centerX, CommonUtils.dp2px(5), centerX, LONG_TICK, paint);
        } else { // 画分钟
            canvas.drawLine(centerX, CommonUtils.dp2px(5), centerX, SHORT_TICK, paint);
        }

        // 旋转画布,避免用三角函数计算位置
        canvas.rotate(360 / MINUTES_COUNT, centerX, centerY);
    }
    canvas.restore();

    // 画时刻
    canvas.save();
    paint.setStyle(Paint.Style.FILL);
    for (int i = 0; i < HOURS_COUNT; i++) {
        int textWidth = (int) paint.measureText(HOURS[i]);
        canvas.drawText(HOURS[i], centerX - textWidth / 2, CommonUtils.dp2px(5 + 13) + LONG_TICK, paint);
        canvas.rotate(360 / HOURS_COUNT, centerX, centerY);
    }
    canvas.restore();
    ...
}

画完刻度和文字之后就需要画时针,分针和秒针,实现方式类似前面的刻度画法,需要确定当前针与12点钟方向的角度值,旋转画布,画一条直线,然后还原转

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值