91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在JavaScript中使用canvas實現一個畫板和簽字板功能

發布時間:2021-02-23 16:17:58 來源:億速云 閱讀:148 作者:Leah 欄目:開發技術

怎么在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>

結果展示

怎么在JavaScript中使用canvas實現一個畫板和簽字板功能

代碼講解

思路

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實現一個畫板和簽字板功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仪征市| 高要市| 晴隆县| 四平市| 榆社县| 玉田县| 绥德县| 张家港市| 靖安县| 衡阳市| 大埔县| 阿荣旗| 青龙| 涡阳县| 佛坪县| 长乐市| 平武县| 集贤县| 山东省| 井冈山市| 黑水县| 宁陕县| 内丘县| 高平市| 宁波市| 如东县| 阿尔山市| 吴江市| 高邑县| 呼图壁县| 岱山县| 藁城市| 威远县| 鹰潭市| 汉阴县| 临颍县| 湟源县| 赫章县| 徐水县| 上杭县| 专栏|