canvas学习笔记3--绘制时钟

translate移动
canvas的translate相当于移动画布的坐标原点位置,而且在这之后画的东西也是按照移动后的坐标原点来画

var canvas = document.querySelector("#canvas")
var cxt = canvas.getContext("2d")

cxt.translate(300,0)
cxt.fillStyle = "deepskyblue"
//填充一个矩形
cxt.fillRect(100,100,300,100)

rotate旋转
参数是带π的弧度
默认旋转的中心是坐标轴原点,而且是整个坐标轴旋转了,在这之后画的东西也是按照旋转之后的坐标来画了

cxt.ratate(Math.PI/4)

scale缩放
参数是 x轴缩放倍数,y轴缩放倍数
默认值是1,1 也就是不放大也不缩小
这里也是放大了坐标尺,并不是放大画像

//x轴放大2倍,y轴放大4倍
ctx.scale(2,4)
//放大之后,乘以相应的数变为1即可复原
ctx.scale(0.5,0.25) // 2*0.5=1,4*0.25=1

save与restore保留与恢复状态
使用这对方法就可以不用每次都计算来复原坐标原点位置,缩放,画笔颜色等
可以执行多次save保留状态,但是恢复时也要执行对应多次才可以恢复到对应状态。类似于撤销

//保留环境的状态(画笔的状态)
cxt.save()
cxt.scale(2,4)
//恢复之前保留的画笔状态
cxt.restore()

绘制钟表

<canvas id="canvas" width="800" height="600"></canvas>

<script>
	var canvas = document.querySelector("#canvas)
	var cxt = canvas.getContext("2d")
	
function renderClock(){
    
    
	cxt.clearRect(0,0,800,600)
	cxt.save()
	//将坐标原点移动到画布的中央
	cxt.translate(400,300)
	//将坐标系逆时针旋转90度
	cxt.rotate(-2*Math.PI/4)

	cxt.save()
	//绘制表盘
	cxt.beginPath()
	cxt.arc(0,0,200,0,2*Math.PI)
	cxt.strokeStyle = "darkgrey"
	cxt.lineWidth = 10
	cxt.stroke()
	cxt.closePath()
	
	//绘制分钟刻度
	for(var j=0;j<60;j++){
    
    
		cxt.rotate(Math.PI/30)
		cxt.beginPath()
		cxt.moveTo(180,0)
		cxt.lineTo(190,0)
		cxt.lineWidth = 2
		cxt.strokeStyle = "orangered"
		cxt.stroke()
		cxt.closePath()
	}
	cxt.restore()
	cxt.save()

	//绘制时钟刻度
	for(var i=0;i<12;i++){
    
    
		cxt.rotate(Math.PI/6)
		cxt.beginPath()
		cxt.moveTo(180,0)
		cxt.lineTo(200,0)
		cxt.lineWidth = 10
		cxt.strokeStyle = "darkgrey"
		cxt.stroke()
		cxt.closePath()
	}
	cxt.restore()
	cxt.save()
	
	var time = new Date()
	var hour = time.getHours()
	var min = time.getMinutes()
	var sec = time.getSeconds()
	//如果时间大于12的话,就直接减去12
	hour=hour>12?hour-12:hour

	//绘制秒针
	cxt.beginPath()
	//根据秒针的时间进行旋转
	cxt.rotate(2*Math.PI/60*sec)
	cxt.moveTo(-30,0)
	cxt.lineTo(170,0)
	cxt.lineWidth = 2
	cxt.strokeStyle = "red"
	cxt.stroke()
	cxt.closePath()
	
	cxt.restore()
	cxt.save()

	//绘制分针
	cxt.beginPath()
	//根据分针的时间进行旋转
	cxt.rotate(2*Math.PI/60*min+2*Math.PI/3600*sec)
	cxt.moveTo(-20,0)
	cxt.lineTo(150,0)
	cxt.lineWidth = 4
	cxt.strokeStyle = "darkblue"
	cxt.stroke()
	cxt.closePath()

	cxt.restore()
	cxt.save()

	//绘制时针
	cxt.beginPath()
	//根据时针的时间进行旋转
	cxt.rotate(2*Math.PI/12*hour+2*Math.PI/60/12*min+2*Math.PI/12/60/60*sec)
	cxt.moveTo(-10,0)
	cxt.lineTo(140,0)
	cxt.lineWidth = 6
	cxt.strokeStyle = "darkslategray"
	cxt.stroke()
	cxt.closePath()
	
	cxt.beginPath()
	cxt.arc(0,0,10,0,2*Math.PI)
	cxt.fillStyle = "deepskyblue"
	cxt.fill()
	cxt.closePath()	

	cxt.restore()	
	cxt.restore()
}

setInterval(function(){
    
    
	renderClock()
},1000)
</script>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44679078/article/details/108949175
今日推荐