简单绘制一个钟表

以前没有写文章的习惯,工作中点滴的积累都逐渐淡忘了,突然发现这样不好。。。先试试手,从用android的*Canvas*绘制一个钟表开始着手吧!
这里我当时并没有将其自定义成控件而是直接画一个bitmap;

这里写图片描述
先上代码

private Bitmap drawClockFace() {
width = 500;
height = 500;
Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
canvas.drawColor(Color.parseColor(“#ff9000”));
Paint paint = new Paint();
paint.setAntiAlias(true);//消除锯齿
paint.setColor(Color.parseColor(“#333333”));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
//绘制外圆;圆心的X和Y坐标,半径,Paint
canvas.drawCircle(width / 2, height / 2, width / 2 - 10, paint);

绘制表盘的外圆是空心圆,这里设置成画线,将其半径设置为少于画布的一半(好看些);

    //绘制表盘内圆
    paint.setStyle(Paint.Style.FILL);
    canvas.drawCircle(width / 2, height / 2, 5, paint);

表盘的圆心是实心圆

//绘制刻度
for (int i = 0; i < 60; i++) {
if (i % 15 == 0) {//位于3,6,9,12,的刻度
paint.setStrokeWidth(4);
canvas.drawLine(width / 2, 10, width / 2, 20, paint);
} else if (i % 5 == 0) {
paint.setStrokeWidth(2);
canvas.drawLine(width / 2, 10, width / 2, 16, paint);
} else {
paint.setStrokeWidth(1);
canvas.drawLine(width / 2, 10, width / 2, 13, paint);
}
canvas.rotate(6, width / 2, height / 2);//顺时针旋转6度,
//因为我画了60个刻度,6X60=一圈儿,如果画12个,就需要旋转360/12,以此类推;
}

表盘一周画60个刻度,表示60分钟,在不同位置的刻度线长不一样,当然也可以只画12个判断简单些,
只是为了好看;

//绘制数字
Paint textpaint = new Paint();
textpaint.setColor(Color.BLACK);
textpaint.setStrokeWidth(6);
textpaint.setTextSize(15);
for (int i = 1; i <= 12; i++) {
canvas.save();//保存当前canvas的状态
canvas.rotate(30 * i, width / 2, height / 2);//第一次将数字转到其应该所在的位置,原点是表盘的圆心
canvas.rotate(-30 * i, width / 2, 40);//第二次逆向旋转是为了将数字归正,原点是数字的中心;
canvas.drawText(String.valueOf(i), width / 2 - 10, 40, textpaint);
canvas.restore();//恢复之前的状态
}
return bm;
}

画数字开始比较头疼,因 为文字会随着rotate的角度旋转,比如画“6”的时候由于旋转了180度就变成数字“9”了(谁家的钟表数字是歪的???),后来想想旋转之后,再以文字的中心为原点把文字逆向转回来就可以了;

表盘画完后由于是静止的,可以只把它当作一张背景而已,不需要重复调用,

bms = drawClockFace();

拿到它的bitmap对象就可以了;
然后开始画表针

private Bitmap drawClock() {
Bitmap bitmap = Bitmap.createBitmap(bms);//表盘背景
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.parseColor(“#333333”));
calendar = Calendar.getInstance();//获取当前时间
hour = calendar.get(Calendar.HOUR);//十二小时制,
minute = calendar.get(Calendar.MINUTE);//分钟
second = calendar.get(Calendar.SECOND);//秒钟

获取当前的时间,时分秒,再分别draw时针,分针,秒针所在的位置。
需要注意的是,分针所在的位置是会随着秒针的转动有所偏移的,时针所在的位置是会随着分针的转动有所偏移,
举个例子,8点50分的时候,表盘的时针偏向于“9”而不是“8”,所以,只有整点或整分的时候时针和分针才刚好指向其对应位置;

//绘制秒针
degress = second * 6;//当前秒针该旋转的角度数,
canvas.save();//保存当前状态
canvas.rotate(degress, width / 2, height / 2);
paint.setStrokeWidth(2);
canvas.drawLine(width / 2, height / 2, width / 2, 90, paint);// 秒针
canvas.restore();//恢复之前状态
//绘制分针
/**@degress
* 当前分针该旋转的角度数;
* 每一分钟分针占6度,整点时角度为 minute * 6,
* 而且要考虑到非整点时的角度偏差,是由分钟决定的
* 每一秒钟时针偏差六度,所以degress应该是 minute * 6 + second * 10;
*/
degress = minute * 6 + second / 10;
canvas.save();
canvas.rotate(degress, width / 2, height / 2);
paint.setStrokeWidth(3);
canvas.drawLine(width / 2, height / 2, width / 2, 120, paint);//分针
canvas.restore();
//绘制时针
/**@degress
* 当前时针该旋转的角度数;
* 每一个小时时针占30度,整点时角度为 hour * 30,
* 而且要考虑到非整点时的角度偏差,是由分钟决定的
* 每一分钟时针偏差两度,所以degress应该是 hour * 30 + minute * 2;
*/
degress = hour * 30 + minute / 2;
canvas.save();
canvas.rotate(degress, width / 2, height / 2);
paint.setStrokeWidth(4);
canvas.drawLine(width / 2, height / 2, width / 2, 150, paint);//时针
canvas.restore();
return bitmap;
}

最后写个定时任务每隔一秒钟执行一次drawClock(),调用timeTask() 钟表就会开始转动;

/**
* 倒计时
*/
public void timeTask() {
timer = new Timer();
timerTask = new java.util.TimerTask() {
@Override
public void run() {
myHandler.sendEmptyMessage(0x123);
}
};
timer.schedule(timerTask, 0, 1000);
}
Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0x123) {
image.setImageBitmap(drawClock());
}
}
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值