真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

vue移動端使用canvas簽名的實現(xiàn)

效果

創(chuàng)新互聯(lián)建站專注于白云企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城開發(fā)。白云網(wǎng)站建設(shè)公司,為白云等地區(qū)提供建站服務(wù)。全流程按需求定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

vue移動端使用canvas簽名的實現(xiàn)

canvas畫板移動端 .gif

需求

  在一些項目業(yè)務(wù)中,經(jīng)常會使用到畫板,讓用戶自己去寫/畫一些東西做標(biāo)示,比如說在線簽電子合約、簽名等,如果不用插件,那么如何使用h6的canvas畫布來實現(xiàn)這一需求呢? 【本篇只討論移動端,PC端請看上篇】

分析

  很明顯,我們需要一個canvas,關(guān)于canvas的一些基本操作可以在w3school或者別的一些平臺上熟悉一下,其實本例也是基礎(chǔ)操作。本案例在vue中完成。(脫離vue也一樣。)

  • 首先,需要一個canvas畫布
  • 其次,考慮邏輯
  • 把邏輯實現(xiàn)

1. canvas畫布

隨意布局的一個畫布,此處值得注意的是如果canvas的寬高確定,則在html>canvas中直接寫寬高,如果不確定,根據(jù)別的元素變化,那么可以在js中初始化畫布時寫。

html

布局

.boardBox{
  margin: 30px auto;
  width: 90vw;
  height: 25vh;
  background: #f9f9f9;
  canvas{
    border: 1px solid #b3b3b3;
  }
}

畫布初始化

let board = this.$refs.board;  // 獲取DOM
board.width = this.$refs.boardBox.offsetWidth; // 設(shè)置畫布寬
board.height = this.$refs.boardBox.offsetHeight;  // 設(shè)置畫布高
this.ctx = board.getContext('2d');  // 二維繪圖
this.ctx.strokeStyle = '#000';  // 顏色
this.ctx.lineWidth = 3; // 線條寬度

2. 邏輯分析

由于本篇只討論移動端端,因此無非是在畫布上監(jiān)聽三個觸摸事件:touchstart、touchmove、touchend。
那么,在這三個事件中,分別需要做什么呢?

touchstart

開始滑動按下,需要做:

  • 獲取觸摸點做畫布上的位置
  • 存為一個點坐標(biāo)(起始點)
  • 以起始點建立一個路徑
  • 開啟畫布操作

touchmove

觸摸滑動時,又要做那些準(zhǔn)備呢?

  • 判斷是否開啟畫布操作,如果沒開啟就禁止繪制,因此先判斷是否當(dāng)前狀態(tài)可繪制
  • 獲取觸摸點做畫布上的位置
  • 上一個點到這一個點作連線
  • 繪制出來
  • 當(dāng)前點存儲,下一次用

touchend

滑動結(jié)束,事件結(jié)束:

  • closePath() // 停止繪制
  • 關(guān)閉畫布操作的開關(guān)

好了,其實就是這三個事件,理清楚之后去代碼實現(xiàn)就簡單得多了。附上代碼一份。

3. 代碼

CSS略,如初始化即可,不是重點。

data() { return { ctx: null, point: { x: 0, y: 0 }, moving: false // 是否正在繪制中且移動 }; }, mounted() { let board = this.$refs.board; // 獲取DOM board.width = this.$refs.boardBox.offsetWidth; // 設(shè)置畫布寬 board.height = this.$refs.boardBox.offsetHeight; // 設(shè)置畫布高 this.ctx = board.getContext('2d'); // 二維繪圖 this.ctx.strokeStyle = '#000'; // 顏色 this.ctx.lineWidth = 3; // 線條寬度 }, methods: { // 觸摸(開始) mStart (e) { console.log(e); let x = e.touches[0].clientX - e.target.offsetLeft, y = e.touches[0].clientY - e.target.offsetTop; // 獲取觸摸點在畫板(canvas)的坐標(biāo) this.point.x = x; this.point.y = y; this.ctx.beginPath(); this.moving = true; }, // 滑動中... mMove (e) { if(this.moving) { let x = e.touches[0].clientX - e.target.offsetLeft, y = e.touches[0].clientY - e.target.offsetTop; // 獲取觸摸點在畫板(canvas)的坐標(biāo) this.ctx.moveTo(this.point.x, this.point.y); // 把路徑移動到畫布中的指定點,不創(chuàng)建線條(起始點) this.ctx.lineTo(x, y); // 添加一個新點,然后創(chuàng)建從該點到畫布中最后指定點的線條,不創(chuàng)建線條 this.ctx.stroke(); // 繪制 this.point.x = x, this.point.y = y; // 重置點坐標(biāo)為上一個坐標(biāo) } }, // 滑動結(jié)束 mEnd () { if(this.moving) { this.ctx.closePath(); // 停止繪制 this.moving = false; // 關(guān)閉繪制開關(guān) } }, },

思考

  1. 上一篇,在PC端完成繪制,本篇如法炮制,在移動端也順利完成,相比pc端只是稍微的修改了一下獲取坐標(biāo)點的算法而已。那么PC端和移動端如何并存呢?
  2. 出錯了,怎么重新繪制呢?
  3. 繪制完成后,怎么保存呢?

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)站名稱:vue移動端使用canvas簽名的實現(xiàn)
標(biāo)題路徑:http://weahome.cn/article/jgdcjh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部