学习 JavaScript 用 Canvas 画图:从设计页面到实现钟表时钟动图效果

你可曾思考,能否借由绘画的力量抓住时光之流?绘图不仅是一门艺术形式,同时也能激发无限的创意。在这天地间,你可以自由挥洒你宝贵的想象之力,诞生出别具一格的动人杰作。今日,我们共同探讨如何采用绘画技巧,描绘出一款生动的钟表,使时间在你笔尖转动。

第一步:搭建舞台——设计页面

首要任务,为作品搭建一个精彩的展示平台——精美布局犹如舞台基石。源代码便是此基石之上的设计蓝图,看似简约平凡,实则每个环节都影响深远。让我们携手共进,着手布局创作吧!

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport"  content="width=device-width, initial-scale=1.0"/>
		<title>Ballet Clock</title>
		<style>
			.clock{
				display: inherit;
				width: 70vw;
				height: 70vw;
				margin: auto;
				position: relative;
				margin-top: 10vw;
			}
			
			.clock img{
				position: absolute;
				left: 0;
				top: 0;
				width: 100%;
				height: 100%;
			}
		</style>
	</head>
	<body>
		<div>
			<div class="clock">
				<img id="clock"/>
				<img id="hour"/>
				<img id="minute"/>
				<img id="second"/>
			</div>
		</div>
		<script>
			//引入模块
			import BalletClock from './ballet_clock.js';
			
			window.onload=()=>{
				//加载脚本...
			}
		</script>
	</body>
</html>

在此环节,请重点把握页面总体架构,包括画布尺寸设定、布局及背景色彩选择等细部元素。如此处理,能使您的钟表图标更具视觉冲击力与美感。切记,良好开端乃成功关键之一!

第二步:注入生命——加载脚本

界面已设置妥当,下一步就是赋予其活力。脚本的引入宛如为舞台配置光影与音效,使整体画面生动生趣。代码编写需细心且需有恒心,然而,一旦理解,这皆非难题。

const { clock,hour,minute,second } = ((args)=>{
let e={};
	args.forEach(a=>e[a]=document.getElementById(a));
	return e;
})('clock,hour,minute,second'.split(','));
//创建一个模块对象
let bc = new BalletClock();
bc.start({
	bgImg:clock,
	hourImg:hour,
	minuteImg:minute,
	secondImg:second
	//...传入模块参数
},window)

在此环节中,请编写嵌入式代码以加载所需的库及资源。这些代码有助呈现动态绘图效果于页面之上,使您的时钟机芯得以生动展示。无须担忧,只需按照详细步骤执行,便能领略编程魅力,体验其中乐趣无穷。

第三步:创造奇迹——实现模块

现在,我们即将步入创作的关键阶段。引入模块.js文件犹如邀请魔法大师登场,为你展示炫酷特效。虽稍显复杂,但代码量有限,你完全有能力亲自编写。

在此环节中,您需创立模块以达到时钟图形与效能表现的制作。这包括初始化逻辑函数init()及动画执行函数start()等基础操作,从而使您的时钟由静变动,赋予其生命力。

第四步:数学之美——理解角度与坐标

export default class BalletClock{
	constructor(){
		
	}
	#init(config,window){
		const { document } = window;
		const { bgImg, hourImg, minuteImg, secondImg } = config;
		//这里创建一个画布 设置好宽高与图片元素益智
		let canvas = document.createElement('canvas');
		canvas.width=bgImg.width;
		canvas.height=canvas.width;
		//获取画布上下文对象(封装的可操作方法集合)
		let ctx = canvas.getContext('2d');
		const { width, height } = ctx.canvas;
		//表盘中心点
		let center = {
			x: width/2,
			y: height/2,
			r: width/2
		};
		//画表盘
		ctx.fillStyle=config.bgColor;
		ctx.arc(center.x,center.y,center.r,0,Math.PI*2);
		ctx.fill();
		//画刻度
		ctx.strokeStyle=config.foreColor;
		ctx.fillStyle=config.foreColor;
		ctx.textAlign='center';
		ctx.textBaseline='middle';
		ctx.font=`${config.fontSize}px sans-serif`;
		let r = center.r-config.fontSize;
		//旋转中心角度,将分布在不同角度位置的小时数画出来
		for(let a=0,hour=0; a<360; a+=30){
			let angle = (a-90)/180*Math.PI;
			let x = Math.cos(angle)*r;
			let y = Math.sin(angle)*r;
			ctx.fillText(hour==0?'12':hour.toString(),x+center.x,y+center.y);
			hour++;
		}
		bgImg.src=canvas.toDataURL();
		//画时针 最后设置到图片元素钟
		ctx.lineCap='round';
		ctx.lineWidth=config.fontSize/2;
		ctx.clearRect(0,0,width,height);
		ctx.beginPath();
		ctx.moveTo(center.x,center.y);
		ctx.lineTo(center.x,center.y*0.5);
		ctx.stroke();
		ctx.lineWidth=1;
		ctx.beginPath();
		ctx.arc(center.x,center.y,config.fontSize,0,Math.PI*2);
		ctx.fill();
		hourImg.src=canvas.toDataURL();
		//画分针 最后设置到图片元素钟
		ctx.lineWidth=config.fontSize/4;
		ctx.clearRect(0,0,width,height);
		ctx.beginPath();
		ctx.moveTo(center.x,center.y);
		ctx.lineTo(center.x,center.y*0.2);
		ctx.stroke();
		minuteImg.src=canvas.toDataURL();
		//画秒针 最后设置到图片元素钟
		ctx.strokeStyle='#f85';
		ctx.lineWidth=config.fontSize/6;
		ctx.clearRect(0,0,width,height);
		ctx.beginPath();
		ctx.moveTo(center.x,center.y);
		ctx.lineTo(center.x,center.y*0.1);
		ctx.stroke();
		secondImg.src=canvas.toDataURL();
	}
	start(config,window){
		//这里实现开始动画逻辑...
	}
}

图片[1]-学习 JavaScript 用 Canvas 画图:从设计页面到实现钟表时钟动图效果-东山笔记

绘画角度如何定夺,类似于数学之”勾股定理”,看似深奥复杂,实则洞悉其理后,不仅能领略其中美妙,亦可轻松运用于代码编译。在此过程中,我们引入Math.cos()与Math.sin()函数,借助此工具,便可精确计算出时钟指针在圆形边缘的具体位置。

在本部分内容中,您需理解角度与弧度间的换算及其在定位指针时所用到的相关数学公式。此方面知识颇具挑战性,然而同时也利于您充分发挥自身潜在的数学才能。

第五步:动起来的魔法——实现动画

动画的实现无疑是绘画艺术中的精髓所在。通过设计名为’start()’的动画逻辑方法,便可使钟表指针展现出活灵活现的动态效果,宛如于舞台之上翩翩起舞。在此过程中,务必精细调整,以保证动画的流畅性与精确度。

在此过程中,您将会体验到程序设计与美学相融合所产生的独特魅力。每个微小的细节调整皆能创造出别具一格的视觉冲击力,使时间显示变得更为生动且富有情趣。

第六步:见证奇迹——运行效果

最后阶段,恭喜您所有辛勤付出即将迎来成果的展示!打开网络浏览器并启动此页面,若流程无误,相信您将观赏到一幅实时更新的钟表图片,伴有生动的动画效果,宛如时间在您指尖跃动。

在这个时刻,您将体验到极致的成就感。您的创作不仅仅是一幅静态图片,更是一种富有生命力的展示。根据个人爱好,调整色彩及设置参数,便可塑造独特的钟表图案。

export default class YinAndYangTaiChiDiagram{
		
	constructor(){
		
	}
	
	#init = (config,window) => {
		//初始化,绘制钟表...
	}
	
	//这里实现开始动画逻辑
	start(config,window){
		const { bgImg, hourImg, minuteImg, secondImg } = config;
		this.#init(Object.assign({
			fontSize:18,
			bgColor:'#000',
			foreColor:'#fff',
		},config),window);
		//更新显示的逻辑 因调用多次 故写在一个函数中
		const updateAnimation = ()=>{
			let date = new Date();
			//定义一个时分秒的数据
			let  d = {
				hour: date.getHours()%12,
				minute: date.getMinutes(),
				second: date.getSeconds()
			};
			//求秒针的角度
			let angle = d.second/60*360;
			secondImg.style.transform=`rotate(${angle}deg)`;
			//求分针的角度
			angle = d.minute/60*360;
			minuteImg.style.transform=`rotate(${angle}deg)`;
			//求时针的角度
			angle = d.hour/12*360+d.minute/60*30;
			hourImg.style.transform=`rotate(${angle}deg)`;
			//考虑处理性能 调用此处 可避免没必要的更新
			window.requestAnimationFrame(()=>{
				//延迟更新  每一秒就更新
				setTimeout(()=>updateAnimation(),1000)
			});
		};
		//开始更新
		updateAnimation();
	}
}

结语:绘图的魅力与挑战

在此次描绘动态钟表的过程中,您有效掌握了驾驭时间的绘画技巧,并沉浸在编程与艺术交织的愉悦之中。绘画已不仅仅是技能的体现,更是个性的展现。那么,您是否已经被这种创新的乐趣深深吸引?是否愿意拿起画笔,开启属于自己的创作之路呢?

在此欢迎您共享创作心得与理念,以及为此篇优质文章点亮赞同与分享,以此推广画作之魅力给更广泛的人群。翘首企盼您的积极参与,与我们共创更多精彩作品!

© 版权声明
THE END
喜欢就支持一下吧
分享