canvas进阶(2):canvas与事件处理

一、鼠标事件:将鼠标坐标转换为Canvas坐标

       有时候,我们需要给canvas增加事件监听,然而 浏览器通过事件对象传递给监听器的鼠标坐标,是窗口坐标,而不是相对于canvas自身的坐标。大部分情况下,开发者需要知道的是发生鼠标事件的点相对于canvas的位置,而不是在整个窗口中的位置。这个时候就需要我们去做一些转换。

<!DOCTYPE html>
<html>
<head>
	<title>canvas和事件</title>
	<style type="text/css">
		body{
			background: #ddd;
		}
		#canvas{
			position: absolute;
			left:50px;
			top:50px;
			cursor: pointer;
			/*border:thin inset rgba(100,150,230,0.5);*/
		}
		#readout{
			margin-top:10px;
			margin-left:15px;
			color:blue;
		}
	</style>
</head>
<body>
	<div id="readout"></div>
	<canvas id="canvas" width="500" height="250" style="background-color:pink">
		该浏览器不支持canvas!
	</canvas>
	<script type="text/javascript">
		var myCanvas = document.getElementById('canvas'),
		    context = myCanvas.getContext('2d'),
		    readout = document.getElementById('readout'),
		    spritesheet = new Image();

		//浏览器通过事件对象传递给监听器的鼠标坐标,是窗口坐标,而不是相对于canvas自身的坐标。大部分情况下,开发者需要知道的是发生鼠标事件的点相对于canvas的位置,而不是在整个窗口中的位置。
		function windowToCanvas(canvas,x,y){//x,y为当前鼠标相对于坐标轴的位置
			var bbox=canvas.getBoundingClientRect();
			//返回相对于canvas的坐标值
			return {
				x:x-bbox.left*(canvas.width/bbox.width),
				y:y-bbox.top*(canvas.height/bbox.height)
			}
		}
		myCanvas.onmousemove=function(e){
			var loc = windowToCanvas(myCanvas,e.clientX,e.clientY);
			console.log(loc)
		}
		
		
	</script>
</body>
</html>

注:windowToCanvas()方法不只是将canvas边界框的想,y坐标从窗口坐标中减去,而且在canvas元素大小与绘图表面大小不相符的情况下,它还相对这两个坐标进行了缩放。

       说到这里,需要介绍一下什么是canvas元素的大小和绘图表面的大小,可以看一下笔者的上一篇博客: canvas进阶(1):Canvas元素大小与绘图表面大小的区别

二、键盘事件

       一共有三种键盘事件:keydown、keypress、keyup

        canvas是一个不可获取焦点的元素,根据上一讲所说的内容可见在canvas元素上新增键盘事件时徒劳的。如果想要检测键盘事件的话,你应该在document或window对象上新增键盘事件监听器才对。

        键盘事件的另一个常见用途就是在游戏之中处理按键动作,例如利用键盘的上、下、左、右按钮来控制canvas游戏中,控制被“人物”的走向。具体的例子将在后续的讲解中介绍。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值