您好,登錄后才能下訂單哦!
怎么在JavaScript中使用canvas實現一個畫板和簽字板功能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <canvas id="canvas"></canvas> <script> let c = document.getElementById('canvas'); c.width = window.innerWidth; c.height = window.innerHeight; let ctx = c.getContext('2d'); // draw one black board ctx.fillStyle = "black"; ctx.fillRect(0,0,600,300); // 按下標記 let onoff = false, oldx = -10, oldy = -10; // 設置顏色 let linecolor = "white"; // 設置線寬 let linw = 4; // 添加鼠標事件 // 按下 c.addEventListener('mousedown', event => { onoff = true; // 位置 - 10是為了矯正位置,把繪圖放在鼠標指針的頂端 oldx = event.pageX - 10; oldy = event.pageY - 10; },false); // 移動 c.addEventListener('mousemove', event => { if(onoff == true){ let newx = event.pageX - 10, newy = event.pageY - 10; // 繪圖 ctx.beginPath(); ctx.moveTo(oldx,oldy); ctx.lineTo(newx,newy); ctx.strokeStyle = linecolor; ctx.lineWidth = linw; ctx.lineCap = "round"; ctx.stroke(); // 每次移動都要更新坐標位置 oldx = newx, oldy = newy; } }, true); // 彈起 c.addEventListener('mouseup', ()=> { onoff = false; },false); </script> </body> </html>
結果展示
代碼講解
思路
1、鼠標按下,開始描畫。鼠標按下事件。
2、鼠標彈起,結束描畫。鼠標彈起事件。
3、鼠標按下移動,路徑畫線。鼠標移動事件。
代碼講解
整體思路:按下鼠標,觸發移動的開關,移動后開始記錄線條(用移動后的坐標-移動前的坐標,然后繪線),每次移動都會更新舊坐標。松開鼠標后,釋放移動開關。
1、只有在鼠標按下,才會觸發移動繪圖的效果,所以需要增加一個狀態判斷。
2、因為鼠標指針和實際位置有一個偏移量,所以在坐標定位的時候,需要增加pagex-10從而使坐標位于指針的尖端處。
3、每次移動都要更新坐標位置,用小段的線段來模擬不規則的線。
封裝模塊
<canvas id="canvas"></canvas> <script> class Board{ constructor(canvasName = 'canvas', data = new Map([ ["onoff", false], ["oldx", -10], ["oldy", -10], ["fillStyle", "black"], ["lineColor", "white"], ["lineWidth", 4], ["lineCap", "round"], ["canvasWidth", window.innerWidth], ["canvasHeight", window.innerHeight] ])){ // this.data = data; this.c = document.getElementById(canvasName); this.ctx = this.c.getContext('2d'); this.onoff = data.get("onoff"); this.oldx = data.get("oldx"); this.oldy = data.get("oldy"); this.lineColor = data.get("lineColor"); this.lineWidth = data.get("lineWidth"); this.lineCap = data.get("lineCap"); this.c.width = data.get("canvasWidth"); this.c.height = data.get("canvasHeight"); this.ctx.fillStyle = data.get("fillStyle"); this.ctx.fillRect(0,0,600,300); } eventOperation(){ // 添加鼠標事件 // 按下 this.c.addEventListener('mousedown', event => { this.onoff = true; // 位置 - 10是為了矯正位置,把繪圖放在鼠標指針的頂端 this.oldx = event.pageX - 10; this.oldy = event.pageY - 10; },false); // 移動 this.c.addEventListener('mousemove', event => { if(this.onoff == true){ let newx = event.pageX - 10, newy = event.pageY - 10; // 繪圖 this.ctx.beginPath(); this.ctx.moveTo(this.oldx,this.oldy); this.ctx.lineTo(newx,newy); this.ctx.strokeStyle = this.lineColor; this.ctx.lineWidth = this.lineWidth; this.ctx.lineCap = this.lineCap; this.ctx.stroke(); // 每次移動都要更新坐標位置 this.oldx = newx, this.oldy = newy; } }, true); // 彈起 this.c.addEventListener('mouseup', ()=> { this.onoff = false; },false); } } let board = new Board(); board.eventOperation(); </script>
關于怎么在JavaScript中使用canvas實現一個畫板和簽字板功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。