• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    如何在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图像绑定事件监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

    上一篇:canvas 绘图时位置偏离的问题解决
    下一篇:Html5之webcoekt播放JPEG图片流
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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