最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue移動端使用canvas簽名的實現

 更新時間:2020年01月15日 09:50:17   作者:流眸Tel  
這篇文章主要介紹了vue移動端使用canvas簽名的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

效果

canvas畫板移動端 .gif

需求

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

分析

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

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

1. canvas畫布

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

html

<div class="boardBox" ref="boardBox">
  <canvas ref="board"
      
  </canvas>
</div>

布局

.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; // 設置畫布寬
board.height = this.$refs.boardBox.offsetHeight;  // 設置畫布高
this.ctx = board.getContext('2d');  // 二維繪圖
this.ctx.strokeStyle = '#000';  // 顏色
this.ctx.lineWidth = 3; // 線條寬度

2. 邏輯分析

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

touchstart

開始滑動按下,需要做:

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

touchmove

觸摸滑動時,又要做那些準備呢?

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

touchend

滑動結束,事件結束:

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

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

3. 代碼

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

<div class="boardBox" ref="boardBox">
  <canvas ref="board"
      @touchstart="mStart"
      @touchmove="mMove"
      @touchend="mEnd">
  </canvas>
</div>
data() {
  return {
    ctx: null,
    point: {
      x: 0,
      y: 0
    },
    moving: false  // 是否正在繪制中且移動
  };
},
mounted() {
  let board = this.$refs.board;  // 獲取DOM
  board.width = this.$refs.boardBox.offsetWidth; // 設置畫布寬
  board.height = this.$refs.boardBox.offsetHeight;  // 設置畫布高
  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)的坐標
    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)的坐標
      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;  // 重置點坐標為上一個坐標
    }
  },
  // 滑動結束
  mEnd () {
    if(this.moving) {
      this.ctx.closePath();  // 停止繪制
      this.moving = false;  // 關閉繪制開關
    }
  },
},

思考

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue.js實現圖片壓縮封裝方法

    vue.js實現圖片壓縮封裝方法

    這篇文章主要介紹了vue.js實現圖片壓縮封裝方法,包括全局main.js引入方法,通過引入imgupload方法結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • vue + any-touch實現一個iscroll 實現拖拽和滑動動畫效果

    vue + any-touch實現一個iscroll 實現拖拽和滑動動畫效果

    這篇文章主要介紹了vue + any-touch實現一個iscroll實現拖拽和滑動動畫效果,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 某些場景下建議vue query代替pinia原理解析

    某些場景下建議vue query代替pinia原理解析

    這篇文章主要為大家介紹了某些場景下建議vue-query代替pinia原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 詳解vuex的簡單使用

    詳解vuex的簡單使用

    這篇文章主要介紹了詳解vuex的簡單使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Vue一次性簡潔明了引入所有公共組件的方法

    Vue一次性簡潔明了引入所有公共組件的方法

    這篇文章主要介紹了Vue一次性簡潔明了引入所有公共組件的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 關于Echarts餅圖圖例太長的解決方案

    關于Echarts餅圖圖例太長的解決方案

    這篇文章主要介紹了關于Echarts餅圖圖例太長的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解vue 中 scoped 樣式作用域的規(guī)則

    詳解vue 中 scoped 樣式作用域的規(guī)則

    這篇文章主要介紹了vue 中 scoped 樣式作用域的規(guī)則,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • elementUI中MENU菜單踩坑

    elementUI中MENU菜單踩坑

    本文主要介紹了elementUI中MENU菜單踩坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Vue2.0實現簡單分頁及跳轉效果

    Vue2.0實現簡單分頁及跳轉效果

    這篇文章主要為大家詳細介紹了Vue2.0實現簡單數據分頁,及頁數的跳轉效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Vue中使用event的坑及解決event is not defined

    Vue中使用event的坑及解決event is not defined

    這篇文章主要介紹了Vue中使用event的坑及解決event is not defined,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論

彩票| 阿克陶县| 沧州市| 阿巴嘎旗| 延安市| 铜山县| 德格县| 昆山市| 天水市| 枞阳县| 益阳市| 乃东县| 高阳县| 永安市| 金乡县| 梓潼县| 增城市| 蒲城县| 鄂温| 大同县| 绍兴县| 德化县| 贵溪市| 禹州市| 东源县| 苏州市| 沿河| 墨玉县| 东源县| 上虞市| 荃湾区| 西畴县| 巴塘县| 宁津县| 曲阳县| 雅江县| 宁阳县| 深水埗区| 玛多县| 朝阳市| 茂名市|