canvas为什么setInterval内的函数还要重新定位坐标

lyf1991a lyf1991a 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
自己做个时钟,我是用setInterval来循环,但是为什么如果我setInterval函数内没有重新translate的话它就回到原点了?

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset=utf-8>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="renderer" content="webkit">
<script type="text/javascript">
window.onload = function(){
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
var outRadius = 200;
var innerRadius = 190;
var hour, minute, second;
var savedCanvas;

context.save();
context.textAlign = "center";
context.textBaseline = "middle";
context.font = "14px Arial";
context.translate(250, 250);
//画圆
context.beginPath();
context.arc(0, 0, outRadius, 0, Math.PI * 2);
context.stroke();

//画刻度
for(var i = 0; i < 60; i++){
context.beginPath();
context.moveTo(outRadius * Math.cos(-Math.PI / 2 + (Math.PI / 30 * i)),
outRadius * Math.sin(-Math.PI / 2 + (Math.PI / 30 * i)));
if(i % 5 == 0){
var text = "12";
context.lineTo((innerRadius - 10) * Math.cos(-Math.PI / 2 + (Math.PI / 30 * i)),
(innerRadius - 10) * Math.sin(-Math.PI / 2 + (Math.PI / 30 * i)));
if(i != 0){
text = (i / 5).toString();
}
context.strokeText(text, (innerRadius - 24) * Math.cos(-Math.PI / 2 + (Math.PI / 30 * i)),
(innerRadius - 24) * Math.sin(-Math.PI / 2 + (Math.PI / 30 * i)));
}
context.lineTo(innerRadius * Math.cos(-Math.PI / 2 + (Math.PI / 30 * i)),
innerRadius * Math.sin(-Math.PI / 2 + (Math.PI / 30 * i)));
context.stroke();
}
//画圆心
context.beginPath();
context.arc(0, 0, 5, 0, Math.PI * 2);
context.fill();

savedCanvas = context.getImageData(0, 0, canvas.width, canvas.height);

//循环时间
setInterval(drawPoninter, 1000);

function drawPoninter(){
hour = new Date().getHours();
minute = new Date().getMinutes();
second = new Date().getSeconds();
context.putImageData(savedCanvas, 0, 0, 0, 0, canvas.width, canvas.height);

context.save();
context.translate(250, 250);
//画时针
context.beginPath();
context.moveTo(0, 0);
context.lineTo((outRadius - 100) * Math.cos(-Math.PI / 2 + (Math.PI / 6 * hour)),
(outRadius - 100) * Math.sin(-Math.PI / 2 + (Math.PI / 6 * hour)));
context.stroke();

//画分针
context.beginPath();
context.moveTo(0, 0);
context.lineTo((outRadius - 80) * Math.cos(-Math.PI / 2 + (Math.PI / 30 * minute)),
(outRadius - 80) * Math.sin(-Math.PI / 2 + (Math.PI / 30 * minute)));
context.stroke();

//画秒针
context.beginPath();
context.moveTo(0, 0);
context.lineTo((outRadius - 50) * Math.cos(-Math.PI / 2 + (Math.PI / 30 * second)),
(outRadius - 50) * Math.sin(-Math.PI / 2 + (Math.PI / 30 * second)));
context.stroke();

context.restore();
}

context.restore();
};
</script>
<title></title>
</head>
<body>
<canvas id="canvas" width="500" height="500" style="display: block; margin: 30px auto; border: 1px solid #ccc; color: rgba(100, 140, 230, 0.5);"></canvas>
</body>
</html>
...全文

相关推荐

用HTML5的canvas实现一个炫酷时钟效果

下面小编就为大家带来一篇用HTML5的canvas实现一个炫酷时钟效果。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38734492

canvas实现超级炫酷时钟

利用canvas和javascript完成超级炫酷的时钟,用canvas画点绘制数字,小球模拟抛物运动

CrazyHorse02

Vue+Canvas人物地图移动动画[项目代码]

本文介绍了如何使用Vue框架结合Canvas技术实现人物图标在背景地图上移动的动画效果。首先在Vue组件的模板中定义Canvas元素,设置宽高为1060x700。在mounted生命周期中获取Canvas的2D上下文对象,并调用updatePage方法。该方法通过预加载人物图标和背景图片,在所有图片加载完成后使用setInterval定时器每250毫秒更新一次人物坐标(x和y每次增加1),实现人物沿对角线移动的效果。同时,drawGlass方法负责绘制背景图,drawPerson方法在指定位置绘制人物图标并显示名称标签。完整代码包括模板、脚本和样式,其中样式设置了包含背景图的容器。该实现展示了Vue与Canvas结合进行简单动画开发的基本模式。

soda5

HTML5实现黑客帝国字符雨[项目代码]

本文详细介绍了如何使用HTML5和JavaScript实现黑客帝国风格的字符雨效果。通过HTML的canvas标签创建画布,并利用JavaScript动态绘制随机字符,模拟字符下落的效果。代码解析部分包括获取屏幕尺寸、设置字符属性、初始化水滴位置数组以及实现字符下落动画的核心逻辑。运行效果展示了绿色字符在黑色背景上随机下落,形成类似电影《黑客帝国》中的经典场景。该效果适合用于网页背景或特效展示,代码简洁易懂,适合前端开发者学习参考。

e1f2g

原生js简单的小球撞墙动画游戏js源码下载.rar

原生js简单的小球撞墙动画游戏js源码下载.rar

小徐博客
评论 1
收藏 已收藏
分享
返回顶部
lyf1991a
JavaScript 87,983 成员 224,681 内容