• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    如何在Canvas上的图形/图像绑定事件监听的实现

    发布者: 福建二哥 | 发布时间: 2025-6-16 12:31| 查看数: 28| 评论数: 0|帖子模式

    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上的图形/图像绑定事件监听的实现的文章就介绍到这了,更多相关Canvas图像绑定事件监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/html5/745327.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表