网页技术交流
 
发新帖
楼主: 零五零八
查看: 818|回复: 0

[使用教程] 如何在Canvas上的图形/图像绑定事件监听的实现

[复制链接]
零五零八 发表于 2020-11-2 17:13:02 | 显示全部楼层
HTML中只能为元素/标签绑定监听函数;
Canvas绘图中只有一个元素-canvas,每一个图形/图像都不是元素,不能直接进行事件绑定。
解决办法:“事件委托”——让canvas监听所有的事件,计算事件发生坐标点,是否处于某个图形/图像的范围内。
对于标准几何图形可以进行事件绑定;
对于不标准几何图形进行事件绑定非常麻烦。
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4.     <meta charset="UTF-8">
  5.     <title>canvas绘制音乐播放器</title>
  6.     <style>
  7.         #range1,#range2{
  8.             height:3px;
  9.             position: relative;
  10.             border: 0;
  11.             outline: 0;
  12.             box-shadow: 0 3px #300 inset;
  13.         }
  14.         #range1{
  15.             width:250px;
  16.             left:-275px;
  17.             top:-10px;
  18.         }
  19.         #range2{
  20.             transform:rotate(-90deg);
  21.             width:50px;
  22.             left:-320px;
  23.             top:-50px;
  24.         }
  25.     </style>
  26. </head>
  27. <body>
  28.     <canvas id="can1" width="300px" height="500px"></canvas>
  29.     <audio src="voice/珍惜_孙露.mp3" id="audio"></audio>
  30.     <input type="range" min="0" max="1000" value="0" id="range1"/>
  31.     <input type="range" min="0" max="10" step="1" value="3" id="range2"/>
  32. </body>

  33. <script>
  34.     var ctx1=can1.getContext('2d');
  35.     var img=new Image();
  36.     var img1=new Image();
  37.     var img2=new Image();
  38.     img.src="img/bg.jpg";//绘图背景//必须放在img1,img2前赋值,否则会盖住
  39.     img1.src="img/loop.jpg";
  40.     img2.src="img/play1.png";
  41.     var progress=0;//设置权重,判断所有图片是否加载完成
  42.     img.onload=function(){//背景图片加载完成,判断是否所有图片加载完成,是-->开始画图
  43.         progress+=20;
  44.         (progress==60)&&star();
  45.     }
  46.     img1.onload=function(){//背景图片加载完成,判断是否所有图片加载完成,是-->开始画图
  47.                 progress+=20;
  48.         (progress==60)&&star();
  49.     }
  50.     img2.onload=function(){//背景图片加载完成,判断是否所有图片加载完成,是-->开始画图
  51.                 progress+=20;
  52.         (progress==60)&&star();
  53.     }
  54.     //开始画图
  55.     function star(){
  56.         ctx1.drawImage(img,0,0,300,500);//绘背景图
  57.         loop();//绘制循环图 img1
  58.         ctx1.drawImage(img2,100,350,100,100);//绘图2
  59.     }

  60.     //循环事件,点击事件的全局变量
  61.     var i=0;
  62.     var time=null;
  63.     var ispause=true;
  64.     //循环函数
  65.     function loop(){
  66.         ctx1.save();//保存画笔当前状态
  67.         ctx1.translate(150,165);//平移
  68.         ctx1.rotate(i*Math.PI/180);//旋转
  69.         ctx1.drawImage(img1,-65,-65);//绘图
  70.         ctx1.restore();//复位画笔之前的状态
  71.         //绘画两个圆
  72.         ctx1.strokeStyle="#000";
  73.         ctx1.lineWidth=20;
  74.         ctx1.arc(150,165,85,0,2*Math.PI);
  75.         ctx1.stroke();
  76.         ctx1.beginPath();
  77.         ctx1.strokeStyle="#303";
  78.         ctx1.lineWidth=10;
  79.         ctx1.arc(150,165,75,0,2*Math.PI);
  80.         ctx1.stroke();

  81.         i+=10;
  82.         (i>=360)&&(i=0);
  83.     }
  84.     //点击事件
  85.     can1.onclick=function(e){
  86.         var x= e.offsetX;
  87.         var y= e.offsetY;
  88.         //console.log(x,y);
  89.         if((x-150)*(x-150)+(y-400)*(y-400)<=50*50*Math.PI){
  90.             //console.log("我是圆");
  91.             if(ispause){
  92.                 audio.play();
  93.                 ispause=false;
  94.                 img2.src="img/pause1.png";
  95.                 time=setInterval(loop,100);
  96.             }else{
  97.                 audio.pause();
  98.                 //clearInterval(time);
  99.                 //ispause=true;
  100.                 //img2.src="img/play.png";
  101.             }
  102.         }

  103.         //定时器,监听音乐是否播放完成,主要为了音乐播放完成停止
  104.         setInterval(function(){
  105.             if(audio.paused){
  106.                 ispause=true;
  107.                 clearInterval(time);
  108.                 img2.src="img/play1.png";
  109.             }
  110.         },5);
  111.     }

  112.     //进度条改变事件--进度
  113.     range1.onchange=function(){//当前进度=音乐总时长*range当前值/range最大value值
  114.         audio.currentTime=parseFloat(range1.value*audio.duration/range1.max);
  115.     }
  116.     //监听音乐当前播放进度,时间低进度条改变事件失效(来不及改变)
  117.     setInterval("range1.value=parseFloat(range1.max*audio.currentTime/audio.duration);",400);
  118.     //进度条改变事件--音量
  119.     audio.volume=0.3;
  120.     range2.onchange=function(){
  121.         audio.volume=range2.value/10;
  122.     }
  123. </script>
  124. </html>
复制代码


到此这篇关于如何在Canvas上的图形/图像绑定事件监听的实现的文章就介绍到这了,
快速回复 返回顶部 返回列表