溫馨提示×

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

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

如何使用canvas設(shè)計(jì)出一個(gè)簡易的畫板

發(fā)布時(shí)間:2021-03-11 15:25:45 來源:億速云 閱讀:287 作者:小新 欄目:web開發(fā)

小編給大家分享一下如何使用canvas設(shè)計(jì)出一個(gè)簡易的畫板,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

先看看效果吧

如何使用canvas設(shè)計(jì)出一個(gè)簡易的畫板

效果先描述一下哈:這里有一個(gè)canvas畫布和幾個(gè)按鈕,canvas畫布是一個(gè)畫板,可以畫任何的圖形,按鈕可以設(shè)置畫板的畫筆顏色,也可以清除畫板,當(dāng)然,你要是畫出一副曠世奇畫,請(qǐng)點(diǎn)擊右鍵將圖片另存為,你懂的!

那這個(gè)是怎么做的呢?

我先說原理在貼代碼,方便大家理解,我都這樣了,就不要直接拿來主義了哈!

原理其實(shí)很簡單,這里用到的核心的方法是lineTo()和stroke(),看過前面的API文章的同學(xué)應(yīng)該明白是什么意思,就是劃線嘛

當(dāng)在畫布中,如果按下鼠標(biāo),我們將畫布的起始點(diǎn)放在此時(shí)鼠標(biāo)的位置,用到的是moveTo(),然后鼠標(biāo)移動(dòng)的時(shí)候,用lineTo()畫路徑,用stroke()來填充路徑,移一下畫一下,這樣就能畫出曲線來,當(dāng)鼠標(biāo)抬起的時(shí)候,我們只需要取消鼠標(biāo)的動(dòng)作即可,如果你看過我寫的鼠標(biāo)拖拽效果,是不是感覺很像啊,對(duì)的,思路跟拖拽是差不多的,只是具體的內(nèi)容不一樣而已,如果你沒看過鼠標(biāo)的拖拽效果,可以看這里 鼠標(biāo)拖拽

下面的按鈕因?yàn)楦髯钥刂频臇|西不一樣,我用了一個(gè)switch方法來給各自添加效果,設(shè)置顏色用到的canvas屬性是strokeStyle,清除畫布的方法在API里面沒有講到,可能是講漏了,這里說一下吧,這里是用的clearRect()方法,還是說一下吧:

clearRect(x,y,w,h)  在給定的矩形內(nèi)清除指定的像素

參數(shù):x,y 表示要清除的矩形的左上角的坐標(biāo), w,h 表示要清除的矩形的寬高

看到這參數(shù),我們可以了解到,它可以清除局部的畫布的內(nèi)容,也可以清除整個(gè)畫布的內(nèi)容,看你給多大的區(qū)域了,本實(shí)例是清除的整個(gè)畫布,因?yàn)槲覀冃枰麄€(gè)畫布都清除掉,如果你只想清除你不想要的那塊,可以設(shè)置一個(gè)精確的區(qū)域,我就不在這里啰嗦了!

大致的原理就這么簡單,我把代碼貼出來供大家參考理解,順便把效果地址貼出來體驗(yàn)一下,廢話不多說了,看代碼:

css:

*{ padding:0; margin:0;}body{ background:#ccc;}canvas{ background:#fff; margin:50px 10px; }input{ display:inline-block; width:80px; height:30px; cursor:pointer; margin-left:10px;}

html:

 <canvas width="500" height="500" id="canvas">
        <span>親,您的瀏覽器不支持canvas,換個(gè)瀏覽器試試吧!</span>
    </canvas>
    <p>
        <input type="button" value="紅畫筆" id="red">
        <input type="button" value="綠畫筆" id="green">
        <input type="button" value="藍(lán)畫筆" id="blue">
        <input type="button" value="重置顏色" id="default">
        <input type="button" value="清除畫布" id="clear">
    </p>

js:

window.onload = function(){        var canvas = document.getElementById("canvas");        var ctx = canvas.getContext("2d");        var oInput = document.getElementsByTagName("input");        for(var i=0;i<oInput.length;i++){
            oInput[i].onclick = function(){                var ID = this.getAttribute('id');                switch(ID){                    case 'red':
                        ctx.strokeStyle = 'red';                        break;                    case 'green':
                        ctx.strokeStyle = 'green';                        break;                    case 'blue':
                        ctx.strokeStyle = 'blue';                        break;                    case 'default':
                        ctx.strokeStyle = 'black';                        break;                    case 'clear':
                        ctx.clearRect(0,0,canvas.clientWidth,canvas.clientHeight);                        break;    
                }    
            }    
        }
        draw();        function draw(){
            canvas.onmousedown = function(ev){                var ev = ev || event;
                ctx.beginPath();
                ctx.moveTo(ev.clientX-canvas.offsetLeft,ev.clientY-canvas.offsetTop);
                document.onmousemove = function(ev){                    var ev = ev || event;
                    ctx.lineTo(ev.clientX - canvas.offsetLeft,ev.clientY - canvas.offsetTop);
                    ctx.stroke();    
                }
                document.onmouseup = function(ev){
                    document.onmousemove = document.onmouseup = null;
                    ctx.closePath();
                }
                
            }
        }
        
        
        
    }

哦,這里的一個(gè)細(xì)節(jié)忘記交代了,就是必須在繪圖部分加上路徑閉合,即beginPath()和closePath(),為什么?因?yàn)樵诿看问髽?biāo)抬起之后,切換下面的樣式或者清除畫布的時(shí)候,如果路徑不閉合的話,那么后面的操作會(huì)污染前面所畫的東西,比如前面用紅畫的,現(xiàn)在我切換到綠色,現(xiàn)在畫的和原來畫的都變成綠了,比如清除畫布,畫過一次之后清除,然后再畫的時(shí)候第一次畫的東西又出來了,這都不是我們想要的,所以此點(diǎn)需謹(jǐn)記!

看完了這篇文章,相信你對(duì)“如何使用canvas設(shè)計(jì)出一個(gè)簡易的畫板”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

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

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

AI