canvas跟随鼠标绘制(如何在Canvas上的图形/图像绑定事件监听的实现)
类别:Web前端 浏览量:1076
时间:2021-10-22 07:59:42 canvas跟随鼠标绘制
如何在Canvas上的图形/图像绑定事件监听的实现HTML中只能为元素/标签绑定监听函数;
Canvas绘图中只有一个元素-canvas,每一个图形/图像都不是元素,不能直接进行事件绑定。
解决办法:“事件委托”——让canvas监听所有的事件,计算事件发生坐标点,是否处于某个图形/图像的范围内。
对于标准几何图形可以进行事件绑定;
对于不标准几何图形进行事件绑定非常麻烦。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>canvas绘制音乐播放器</title> <style> #range1,#range2{ height:3px; position: relative; border: 0; outline: 0; box-shadow: 0 3px #300 inset; } #range1{ width:250px; left:-275px; top:-10px; } #range2{ transform:rotate(-90deg); width:50px; left:-320px; top:-50px; } </style> </head> <body> <canvas id="can1" width="300px" height="500px"></canvas> <audio src="voice/珍惜_孙露.mp3" id="audio"></audio> <input type="range" min="0" max="1000" value="0" id="range1"/> <input type="range" min="0" max="10" step="1" value="3" id="range2"/> </body> <script> var ctx1=can1.getContext('2d'); var img=new Image(); var img1=new Image(); var img2=new Image(); img.src="img/bg.jpg";//绘图背景//必须放在img1,img2前赋值,否则会盖住 img1.src="img/loop.jpg"; img2.src="img/play1.png"; var progress=0;//设置权重,判断所有图片是否加载完成 img.onload=function(){//背景图片加载完成,判断是否所有图片加载完成,是-->开始画图 progress+=20; (progress==60)&&star(); } img1.onload=function(){//背景图片加载完成,判断是否所有图片加载完成,是-->开始画图 progress+=20; (progress==60)&&star(); } img2.onload=function(){//背景图片加载完成,判断是否所有图片加载完成,是-->开始画图 progress+=20; (progress==60)&&star(); } //开始画图 function star(){ ctx1.drawImage(img,0,0,300,500);//绘背景图 loop();//绘制循环图 img1 ctx1.drawImage(img2,100,350,100,100);//绘图2 } //循环事件,点击事件的全局变量 var i=0; var time=null; var ispause=true; //循环函数 function loop(){ ctx1.save();//保存画笔当前状态 ctx1.translate(150,165);//平移 ctx1.rotate(i*Math.PI/180);//旋转 ctx1.drawImage(img1,-65,-65);//绘图 ctx1.restore();//复位画笔之前的状态 //绘画两个圆 ctx1.strokeStyle="#000"; ctx1.lineWidth=20; ctx1.arc(150,165,85,0,2*Math.PI); ctx1.stroke(); ctx1.beginPath(); ctx1.strokeStyle="#303"; ctx1.lineWidth=10; ctx1.arc(150,165,75,0,2*Math.PI); ctx1.stroke(); i+=10; (i>=360)&&(i=0); } //点击事件 can1.onclick=function(e){ var x= e.offsetX; var y= e.offsetY; //console.log(x,y); if((x-150)*(x-150)+(y-400)*(y-400)<=50*50*Math.PI){ //console.log("我是圆"); if(ispause){ audio.play(); ispause=false; img2.src="img/pause1.png"; time=setInterval(loop,100); }else{ audio.pause(); //clearInterval(time); //ispause=true; //img2.src="img/play.png"; } } //定时器,监听音乐是否播放完成,主要为了音乐播放完成停止 setInterval(function(){ if(audio.paused){ ispause=true; clearInterval(time); img2.src="img/play1.png"; } },5); } //进度条改变事件--进度 range1.onchange=function(){//当前进度=音乐总时长*range当前值/range最大value值 audio.currentTime=parseFloat(range1.value*audio.duration/range1.max); } //监听音乐当前播放进度,时间低进度条改变事件失效(来不及改变) setInterval("range1.value=parseFloat(range1.max*audio.currentTime/audio.duration);",400); //进度条改变事件--音量 audio.volume=0.3; range2.onchange=function(){ audio.volume=range2.value/10; } </script> </html>
到此这篇关于如何在Canvas上的图形/图像绑定事件监听的实现的文章就介绍到这了,更多相关Canvas图像绑定事件监听内容请搜索开心学习网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持开心学习网!
您可能感兴趣
- react事件绑定的方式和区别(react合成事件与原生事件的相关理解)
- apache域名绑定(Apache配置独立域名的方法)
- vueclass和style绑定(Vue中Class和Style实现v-bind绑定的几种用法)
- dedecms手机页面怎么固定(织梦dedecms配置手机wap站点并绑定二级域名)
- docker容器设置端口(Docker 实现容器端口绑定本地端口)
- 如何用阿里云绑定域名(阿里云域名和ip绑定步骤方法实现)
- phpstudy怎么配置域名并访问(phpstudy怎么绑定目录实现域名访问)
- xampp安装后启动apache弹出对话框(XAMPP下使用顶级域名绑定虚拟主机的配置方法和示例)
- vue多个对象实现双向数据绑定(利用js实现Vue2.0中数据的双向绑定功能)
- react的事件绑定(React事件绑定的方式详解)
- vue 动态绑定指令(vue动态绑定图标的完整步骤)
- 微信公众号用户怎么增加(微信公众号用户与网站用户的绑定解决方案分析)
- lnmp安装php(LNMP系列教程之二 删除站点及域名绑定)
- docker 容器怎么访问宿主机网络(Docker绑定固定IP/跨主机容器互访操作)
- 宝塔面板解除域名绑定代码(宝塔面板网站防跨站攻击open_basedir无法关闭解决办法)
- 怎么样查找linux的ssl证书(护卫神主机大师Linux添加绑定ssl证书图文教程)
- 二胎家庭老大爱闹情绪,用这招很有效(二胎家庭老大爱闹情绪)
- 一个30岁男人外遇失败的全过程(一个30岁男人外遇失败的全过程)
- 《无敌破坏王2》 不聊彩蛋,聊聊我从动画里看到的现实那些事儿(无敌破坏王2不聊彩蛋)
- 《寄生虫》 三观不正 人类悲欢从来不相通,感同身受也并非本能(寄生虫三观不正)
- 这部动漫中的女孩子,可比101女孩更加励志(这部动漫中的女孩子)
- 《白狐的人生》热拍 贾征宇偶像包袱难自弃 图(白狐的人生热拍)
热门推荐
- zabbix sender能否发送告警数据(python3实现zabbix告警推送钉钉的示例)
- python里面的print怎么用(python中的print输出)
- computer browser服务启动后停止(用户IIS APPPOOLDefaultAppPool登录失败的解决方法)
- html5中的语义化标签有哪些(详解HTML5常用的语义化标签)
- python与mysql的联系(MySQL和Python交互的示例)
- web安全常见的测试工具有哪些(Web压力测试工具:http_load、webbench、ab、Siege使用方法)
- mysql的存储方法(MySQL中的binary类型使用操作)
- dedecms怎么调用标签(dedecms 织梦系统栏目及子栏目调用友情连接的方法)
- canvas绘图问题(记一次高分屏下canvas模糊问题)
- phpcurl详解(解决PHP curl或file_get_contents下载图片损坏或无法打开的问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9