溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

前端開(kāi)發(fā)中如何通過(guò)Canvas實(shí)現(xiàn)綁定事件監(jiān)聽(tīng)

發(fā)布時(shí)間:2022-02-23 15:44:35 來(lái)源:億速云 閱讀:819 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“前端開(kāi)發(fā)中如何通過(guò)Canvas實(shí)現(xiàn)綁定事件監(jiān)聽(tīng)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

HTML中只能為元素/標(biāo)簽綁定監(jiān)聽(tīng)函數(shù);Canvas繪圖中只有一個(gè)元素-canvas,每一個(gè)圖形/圖像都不是元素,不能直接進(jìn)行事件綁定。

解決辦法:“事件委托”——讓canvas監(jiān)聽(tīng)所有的事件,計(jì)算事件發(fā)生坐標(biāo)點(diǎn),是否處于某個(gè)圖形/圖像的范圍內(nèi)。

對(duì)于標(biāo)準(zhǔn)幾何圖形可以進(jìn)行事件綁定;

對(duì)于不標(biāo)準(zhǔn)幾何圖形進(jìn)行事件綁定非常麻煩。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>canvas繪制音樂(lè)播放器</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前賦值,否則會(huì)蓋住
    img1.src="img/loop.jpg";
    img2.src="img/play1.png";
    var progress=0;//設(shè)置權(quán)重,判斷所有圖片是否加載完成
    img.onload=function(){//背景圖片加載完成,判斷是否所有圖片加載完成,是-->開(kāi)始畫圖
        progress+=20;
        (progress==60)&&star();
    }
    img1.onload=function(){//背景圖片加載完成,判斷是否所有圖片加載完成,是-->開(kāi)始畫圖
                progress+=20;
        (progress==60)&&star();
    }
    img2.onload=function(){//背景圖片加載完成,判斷是否所有圖片加載完成,是-->開(kāi)始畫圖
                progress+=20;
        (progress==60)&&star();
    }
    //開(kāi)始畫圖
    function star(){
        ctx1.drawImage(img,0,0,300,500);//繪背景圖
        loop();//繪制循環(huán)圖 img1
        ctx1.drawImage(img2,100,350,100,100);//繪圖2
    }

    //循環(huán)事件,點(diǎn)擊事件的全局變量
    var i=0;
    var time=null;
    var ispause=true;
    //循環(huán)函數(shù)
    function loop(){
        ctx1.save();//保存畫筆當(dāng)前狀態(tài)
        ctx1.translate(150,165);//平移
        ctx1.rotate(i*Math.PI/180);//旋轉(zhuǎn)
        ctx1.drawImage(img1,-65,-65);//繪圖
        ctx1.restore();//復(fù)位畫筆之前的狀態(tài)
        //繪畫兩個(gè)圓
        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);
    }
    //點(diǎn)擊事件
    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";
            }
        }

        //定時(shí)器,監(jiān)聽(tīng)音樂(lè)是否播放完成,主要為了音樂(lè)播放完成停止
        setInterval(function(){
            if(audio.paused){
                ispause=true;
                clearInterval(time);
                img2.src="img/play1.png";
            }
        },5);
    }

    //進(jìn)度條改變事件--進(jìn)度
    range1.onchange=function(){//當(dāng)前進(jìn)度=音樂(lè)總時(shí)長(zhǎng)*range當(dāng)前值/range最大value值
        audio.currentTime=parseFloat(range1.value*audio.duration/range1.max);
    }
    //監(jiān)聽(tīng)音樂(lè)當(dāng)前播放進(jìn)度,時(shí)間低進(jìn)度條改變事件失效(來(lái)不及改變)
    setInterval("range1.value=parseFloat(range1.max*audio.currentTime/audio.duration);",400);
    //進(jìn)度條改變事件--音量
    audio.volume=0.3;
    range2.onchange=function(){
        audio.volume=range2.value/10;
    }
</script>
</html>

“前端開(kāi)發(fā)中如何通過(guò)Canvas實(shí)現(xiàn)綁定事件監(jiān)聽(tīng)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI