Canvas事件处理及示例代码分析

  Canvas中常见的事件是鼠标事件和键盘事件,但根据参考文献1,Canvas本身不支持键盘事件,一般都采用window对象监听和处理Canvas中的键盘事件。
  HTML5中的鼠标事件如下图所示,其中标New的是HTML5新增属性事件。本文中主要使用mousemove鼠标事件:
在这里插入图片描述
  HTML5中的键盘事件如下所示,图中从上往下的顺序也是用户按下键盘后触发的键盘事件顺序。本文中主要使用keydown键盘事件。
在这里插入图片描述
  除了事件处理,参考文献1中还介绍了如何在Canvas中实现动画效果,主要是包括使用setInterval函数或者是用window对象的requestAnimationFrame设置循环事件。这两个函数都是实现周期性的绘制图形的函数,不同之处在于setInterval需要手动设置间隔时间,而requestAnimationFrame是浏览器下次重绘之前调用指定的回调函数更新绘制的图形(详细介绍请查看参考文献4)。
  基于参考文献1中的示例代码,对Canvas事件处理进行简要分析和说明。

获取鼠标位置

  该程序的效果是随着鼠标在Canvas中移动,在Canvas下方实时显示鼠标坐标。程序的效果图如下所示:
在这里插入图片描述
  程序的关键之处在于注册了Canvas的mousemove事件处理函数,在该函数中获取鼠标在Canvas中的坐标,然后显示在Canvas下方的段落中。程序的关键代码是兼容不同浏览器中的鼠标坐标获取方式,主要代码如下:

	var x,y;
    var e=e|| window.event;
    if(e.pageX || e.pageY)
    {
        x=e.pageX;
        y=e.pageY;
    }
    else
    {
        x=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
        y=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;
    }
键盘操作小球

  该程序的效果是Canvas中的小球会随着用户按上(↑或w)、下(↓或s)、左(←或a)、右(→或d)键而向上、下、左、右移动。程序的效果图如下(暂时没法插动画,所以看不出来实际效果):
在这里插入图片描述
  程序的关键之处在于注册了页面的keydown事件处理函数,在该函数中根据用户的按键判断Canvas中小球的移动方向,然后更新小球的坐标,最后重绘小球。程序主要代码如下:

	var keyPressed=tools.getKey();
    window.addEventListener("keydown",function(e)
     {
         cxt.clearRect(0,0,cnv.width,cnv.height);

         switch(keyPressed.direction)
         {
             case "up":
                 y-=2;
                 break;

             case "down":
                 y+=2;
                 break;

             case "left":
                 x-=2;
                 break;

             case "right":
                 x+=2;
                 break;
         }

         drawBall(x,y);
     },false
     );
循环移动小球

  该程序的效果是Canvas中的小球从左到右自动移动,当到达右侧边界后会自动重新出现在左侧,循环不止。程序的效果图如下(暂时没法插动画,所以看不出来实际效果):
在这里插入图片描述在这里插入图片描述在这里插入图片描述

  程序的关键之处在于在Canvas中设置循环事件,在循环事件中自动更新小球的横坐标,当小球横坐标大于Canvas右侧便捷时,自动重置小球横坐标。程序的关键代码如下:

	   var cnv=$$("canvas");
       var cxt=cnv.getContext("2d");
       var x=0;

       (function frame()
       {
           window.requestAnimationFrame(frame);
           cxt.clearRect(0,0,cnv.width,cnv.height);

           cxt.beginPath();
           cxt.arc(x,70,20,0,360*Math.PI/180,true);
           cxt.closePath();
           cxt.fillStyle="#6699FF";
           cxt.fill();

           x+=2;

           if(x>cnv.width)
           {
               x=0;
           }
       })();    

参考文献:
[1]从0到1 HTML5 Canvas动画开发
[2]https://www.w3.org/TR/2dcontext/
[3]https://www.runoob.com/tags/ref-eventattributes.html
[4]https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值