背景图的绘制(大圆、数字、小圆点)

掌握基础知识:圆的绘制(arc方法),关于圆的弧度的计算,数学中关于sin cos的用法

圆的弧度为2*Math.PI

12个数字分得弧度每个为2*Math.PI/12

那么rad=i*2*Math.PI/12

x=Math.cos(rad)*所需要的长度(也就是半径-差值)

y=Math.sin(rad)*所需要的长度(也就是半径-差值)

同理可得60个点的绘制

60个数字分得弧度每个rad=i*2*Math.PI/60

x=Math.cos(rad)*所需要的长度(也就是半径-差值)

y=Math.sin(rad)*所需要的长度(也就是半径-差值)

 <!DOCTYPE html>
<html> <head>
<meta charset="utf-8" /> <title>canvas练习</title> </head> <body>
<canvas id="prac" width="500" height="500" style="border:1px solid black"></canvas>
<canvas id="clock" width="500" height="500" style="border:1px solid black"></canvas>
<script>
var prac = document.querySelector("#prac");
var test = prac.getContext("2d");
test.moveTo(20, 25); //起点,但是绘制
test.lineTo(200, 25); //终点
test.stroke(); //绘制路径 test.beginPath();
test.lineWidth = "10";
test.rect(200, 200, 50, 50);
test.stroke(); test.beginPath();
test.rect(260, 200, 50, 50);
test.fill(); test.fillStyle = "rgb(200,0,0)";
test.lineWidth = "10"; //带填充的,画线粗细无作用
test.fillRect(100, 100, 55, 50); //带填充的矩形 test.strokeStyle = "blue";
test.lineWidth = "1";
test.strokeRect(85, 85, 100, 150); //不带填充的矩形 test.beginPath();
test.arc(100, 295, 15, 0, 2 * Math.PI); //圆心坐标+半径+起始角和结束角;
test.stroke(); test.beginPath();
test.arc(150, 295, 15, 0, 2 * Math.PI); //圆心坐标+半径+起始角和结束角;
test.fill(); test.font = "20px Arial";
test.textAlign = "center";
test.fillText("Hello World", 400, 200);
test.textAlign = "center";
test.textBaseline = "hanging";
test.fillText("Hello World", 400, 200); //以下为时钟部分
var clock = document.getElementById("clock");
var ctx = clock.getContext("2d");
var width = clock.width;
var height = clock.height;
var radius = width / 2; //半径
var rem = width / 200; //画面比例 function drawBG() {
ctx.save(); //保存当前环境
ctx.translate(width / 2, height / 2);//转换原点为中心
ctx.beginPath();
ctx.lineWidth = 8 * rem;
//以0,0为原点,r为半径,0为起始角,2*Math.PI为结束角,顺时针画圆
ctx.arc(0, 0, radius - ctx.lineWidth / 2, 0, 2 * Math.PI, false);
ctx.closePath();
ctx.stroke(); var hourNumber = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
//画出1-12的数字
hourNumber.forEach(function (number, i) {
var rad = 2 * Math.PI / 12 * i;
var x = Math.cos(rad) * (radius - 35 * rem);
var y = Math.sin(rad) * (radius - 35 * rem);
ctx.font = 20 * rem + "px Arial"; //拼接字符串
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(number, x, y);
})
//画出秒针走动的60个点
for (let i = 0; i < 60; i++) {
var rad = 2 * Math.PI / 60 * i;
var x = Math.cos(rad) * (radius - 18 * rem);
var y = Math.sin(rad) * (radius - 18 * rem);
ctx.beginPath();
if (i % 5 === 0) {
ctx.fillStyle = "#000";
ctx.arc(x, y, 3 * rem, 0, 2 * Math.PI);
} else {
ctx.fillStyle = "#ccc";
ctx.arc(x, y, 3 * rem, 0, 2 * Math.PI);
}
ctx.fill();
} }
//绘制时针
function drawHour(hour, minute) {
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI / 12 * hour;
var mrad = 2 * Math.PI / 12 / 60 * minute; //分60等份弧度
ctx.rotate(rad + mrad); //时针特殊性+上对应每分钟占的时钟刻度
ctx.moveTo(0, 10 * rem);
ctx.lineWidth = 6 * rem;
ctx.lineCap = "round";
ctx.lineTo(0, -radius / 2);
ctx.stroke();
ctx.restore();
}
//绘制分针
function drawMinute(minute) {
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI / 60 * minute;
ctx.rotate(rad);
ctx.moveTo(0, 10 * rem);
ctx.lineWidth = 3 * rem;
ctx.lineCap = "round";
ctx.lineTo(0, -radius + 45 * rem);
ctx.stroke();
ctx.restore();
}
//绘制秒针
function drawSecond(second) {
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI / 60 * second;
ctx.rotate(rad);
ctx.moveTo(-2 * rem, 20 * rem);
ctx.lineTo(2 * rem, 20 * rem);
ctx.lineTo(1 * rem, -radius + 18 * rem);
ctx.lineTo(-1 * rem, -radius + 18 * rem);
ctx.fillStyle = "red";
ctx.fill();
ctx.restore();
}
//画时钟上的中心白色原点
function drawDot() {
ctx.beginPath();
ctx.arc(0, 0, 2 * rem, 0, 2 * Math.PI, false);
ctx.fillStyle = "white";
ctx.fill();
} //绘制整体函数
function draw() {
ctx.clearRect(0, 0, width, height); //清空画布
var now = new Date();//获取时间
var hour = now.getHours();
var minute = now.getMinutes();
var second = now.getSeconds();
console.log(hour, minute, second);
drawBG();
drawHour(hour, minute);
drawMinute(minute);
drawSecond(second);
drawDot();
ctx.restore(); //清除,起始坐标回到0,0
}
draw();//提前先画一次,避免空白
setInterval(draw, 1000); //每秒执行一次
</script>
</body> </html>

注意点:

1.rem=width/200(基准值)

所需要的像素换算=x*rem

2.canvas的字体设置可以用拼接字符串来动态根据rem修改大小:

ctx.font = 20 * rem + "px Arial"; //拼接字符串

3.为了使文字填充为该坐标中心, 那么利用文字对齐方式调整至中心位置

ctx.textAlign = "center";
ctx.textBaseline = "middle";

4.记得保存和重置,因为清除画布(不清除画布,画面会重叠)需要把坐标移动至左上角原始位置,所以本来我们画背景的时候将画布原点移致画布中心,所以要ctx.restore()

5.moveTo和lineTo都是不绘制的,最后得stroke(),或者fill()

6.由于时针的特殊性,所以要加上分钟走过的弧度来确定指针指向的位置

var rad = 2 * Math.PI / 12 * hour;
var mrad = 2 * Math.PI / 12 / 60 * minute; //分60等份弧度
ctx.rotate(rad + mrad); //时针特殊性+上对应每分钟占的时钟刻度

7.时分秒针以及中心原点的绘制,其中时针和分针就是绘制一个直线即可,秒针则画一个梯形样式呈现又粗到细的效果,要掌握的基础知识:直线的绘制,旋转角度的控制(rotate以弧度为单位),时钟的动态走动效果,则用setInterval函数控制每一秒钟执行一次绘制时钟的函数。

小任务之Canvas绘制时钟的更多相关文章

  1. 使用canvas绘制时钟

    使用canvas绘制时钟  什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...

  2. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

    小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...

  3. Canvas绘制时钟

    ①首先在HTML的body标签中添加一个canvas标签,用于绘制时钟. <canvas id="myCanvas" width="600" height ...

  4. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  5. html5 Canvas绘制时钟以及绘制运动的圆

    1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...

  6. 用canvas绘制时钟

    用canvas做时钟其实很简单,下面是我做出的效果: 是不是还挺漂亮的? 下面上代码: html <div class="whole"> <canvas id=& ...

  7. HTML5 Canvas 绘制时钟

    网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下Canvas,觉得不难,就自己做了一个. 先看一下截图: 比较简陋,但是该有的都有了,样式只加了个阴影. html代码就不贴了,就一个canvas ...

  8. 使用canvas绘制时钟 (http://heeroluo.net/Article/Detail/95)

    准备工作 在HTML中指定一个区域放置时钟: <div id="clock" style="position: relative;"></di ...

  9. canvas绘制时钟及注释及save和restore的用法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

随机推荐

  1. Ionic2的CLI的命令行

    http://blog.csdn.net/qq_33315185/article/details/68067747 在我们开发Ionic app的时候 CLI 是一个非常重要的工具.CLI包含了很多开 ...

  2. UITouch笔记

    UITouch是什么 表示在在屏幕上触摸事件,包括触摸的位置.大小.力度(3D touch).运动. 在一系列触摸事件中,UITouch都是同一个,但是不要retain某一个UITouch.如果要保存 ...

  3. python爬虫学习心得

    作为一名python的忠实爱好者,我开始接触爬虫是在2017年4月份,最开始接触它的时候遇到两个梗,一个是对python还不算太了解(当然现在也仍然在努力学习它的有关内容),二是对爬虫心怀一份敬畏之心 ...

  4. python之类与对象(5)

    6. 类的多继承与超继承 6.1 多继承 python的类还有一个特点,就是可以继承多个类.但是我们作为测试人员,在实际中很少用到这个多继承,这里不就详细(一直都不详细,hhhh)写了.上代码: #! ...

  5. springcloud(三)-Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  6. 简易APB4 slave实践

    一个简易的(不完整的)APB4 slave的可以没有PREADY和PSLVERR,这两个信号都被赋予常数,以及没有PPROT. 两种不同类型的寄存器: 图: 普通寄存器电路图 图: 带读写控制寄存器电 ...

  7. 关于tp5全局过滤

    在config里面. // 默认全局过滤方法 用逗号分隔多个'default_filter' => 'htmlspecialchars',

  8. Python学习 day12

    一.@wraps __name__    查看函数的名字 __doc__   查看函数的文档字符串 例: def func(arg): """ 这是一个测试函数,这里是函 ...

  9. 映射网络驱动器 net use

    net use z: \\10.1.1.1\Software 12345678 /user:admin net use z: /del 然后文件夹Software权限

  10. linux下非root用户获得/dev/ttyUSB0的读写权限

    首先查看/dev/ttyUSB0的权限属性,在终端输入: ll /dev/ttyUSB0 teashaw@xiaopeiqing.com:~$ ll /dev/ttyUSB0 crw-rw—- 1 r ...