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

掌握基础知识:圆的绘制(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. MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled

    初试redis,删除或者修改值的时候报的错,解决方式是运行命令: 127.0.0.1:6379> config set stop-writes-on-bgsave-error no

  2. 博弈论教程(A Course in Game Theory)摘录

    P4 在我们所研究的模型中,决策主体往往要在不确定条件下进行决策.参与人可能: 不能确定环境的客观因素: 对博弈中发生的事件不很清楚: 不能确定别的不确定参与人的行动: 不能确定别的参与人的推理. 为 ...

  3. java 使用idea将工程打成jar并创建成exe文件类型执行

    https://blog.csdn.net/weixin_38310965/article/details/80392767

  4. PHP 数组与CSV文件互转

    项目说明 数组导出CSV,ZIP文件,CSV,ZIP文件还原数组(Array export file,file restore array)适用于导入导出会员,商品信息注意:读取中文文件名文件.数据时 ...

  5. ZOJ - 3946-Highway Project(最短路变形+优先队列优化)

    Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he can ...

  6. Flutter Map<String, dynamic> 、List<String> a-z 排序

    字符串从 a-z 排序. Map<String, String> map = XXX, List<String> keys = map.keys.toList(); // ke ...

  7. linux操作python

    Linux安装python3: sudo apt-get install python3.5 安装python库 sudo apt-get install python3-setuptools sud ...

  8. 3dsmax2013卸载/安装失败/如何彻底卸载清除干净3dsmax2013注册表和文件的方法

    3dsmax2013提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2013失败提示3dsmax2013安装未完成,某些产品无法安装,也有时候想重新 ...

  9. SQLite3开发接口函数详解

    SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: ...

  10. FastDFS安装、配置、部署(一)-安装和部署 (转)

    FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站 Fast ...