中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

小程序canvas手寫簽名適配PC怎么實現

發布時間:2023-04-18 17:33:12 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“小程序canvas手寫簽名適配PC怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“小程序canvas手寫簽名適配PC怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

先看看效果圖

小程序canvas手寫簽名適配PC怎么實現

鼠標用起來效果不怎么樣,但是還是挺流暢的。

看看代碼

主要就看看 Page.js 的代碼吧,也就這個不一樣,當然 HTML 內的 canvas 標簽記得加上 canvas-id,把 type = '2d' 給去掉。

// pages/mine/signature/drawCanvas/drawCanvas.js
var app = getApp()
Page({
  data: {
    context: null,
    index: 0,
    height: 0,
    width: 0,
    // 前 一點
    preX: 0,
    preY: 0,
    preCenterX: 0,
    preCenterY: 0
  },
  onShow: function () {
    let query = wx.createSelectorQuery();
    const that = this;
    query.select('#firstCanvas').boundingClientRect();
    query.exec(function (rect) {
      let width = rect[0].width;
      let height = rect[0].height;
      that.setData({
        width,
        height
      });
      const context = wx.createCanvasContext('firstCanvas')
      that.setData({
        context: context
      })
      context.setStrokeStyle('#000000')
      context.setLineWidth(2)
      context.setFontSize(20)
    });
  },
  /**記錄開始點 */
  bindtouchstart: function (e) {
    let context = this.data.context
    let curX = e.changedTouches[0].x
    let curY = e.changedTouches[0].y
    context.beginPath()
    context.moveTo(curX, curY)
    this.data.preX = curX
    this.data.preY = curY
    this.data.preCenterX = curX
    this.data.preCenterY = curY
  },
  /**記錄移動點,刷新繪制 */
  bindtouchmove: function (e) {
    let context = this.data.context
    let preX = this.data.preX
    let preY = this.data.preY
    let preCenterX = this.data.preCenterX
    let preCenterY = this.data.preCenterY
    let curX = e.changedTouches[0].x
    let curY = e.changedTouches[0].y
    let deltaX = Math.abs(preX - curX)
    let deltaY = Math.abs(preY - curY)
    // 相差大于3像素的時候作二階貝塞爾曲線
    if (deltaX >= 3 || deltaY >= 3) {
      // 前后兩點中心點
      let centerX = (preX + curX) / 2
      let centerY = (preY + curY) / 2
      //這里以前一點作為控制點,中心點作為終點,起始點為上一次的中點,很流暢啊!
      context.moveTo(preCenterX, preCenterY)
      context.quadraticCurveTo(preX, preY, centerX, centerY);
      context.stroke();
      context.draw(true);
      this.data.preX = curX
      this.data.preY = curY
      this.data.preCenterX = centerX
      this.data.preCenterY = centerY
    }
  },
  /**清空畫布 */
  clear: function () {
    let context = this.data.context
    context.clearRect(0, 0, this.data.width, this.data.height);
    context.draw();
    context.setStrokeStyle('#000000')
    context.setLineWidth(2)
    context.setFontSize(20)
  },
  /**導出圖片 */
  export: function () {
    const that = this;
    this.data.context.draw(false, wx.canvasToTempFilePath({
      x: 0,
      y: 0,
      width: that.data.width,
      height: that.data.height,
      destWidth: that.data.width,
      destHeight: that.data.height,
      fileType: 'png',
      canvasId: 'firstCanvas',
      success(res) {
        app.log("tempFilePath:" + res.tempFilePath);
		// 你的代碼
      },
      fail() {
        wx.showToast({
          title: '提交失敗',
          icon: 'none',
          duration: 2000
        })
      }
    }))
  },
})

下面仔細講講不同點

  • 獲取canvas方式不一樣

這里因為使用的是舊版本的 canvas,所以用的還是原來的方式獲取 canvas 的。

  • 屬性值多加了 preCenterX 和 preCenterY

這個就很奇怪哦,可能是因為 canvas 的用法不一樣,導致使用貝塞爾曲線的時候無法正確的定位到前一點位置,也可能是里面的前一點位置就是 canvas 內移動時一系列點中前一個點的位置,放在就不對,如果按前一篇博客的方式做,出來的就是下面的效果:

小程序canvas手寫簽名適配PC怎么實現

這里記得在手指初次落下的時候,初始化這兩個值,并在移動后重新賦值。

  • 導出圖片方式不一樣

這里就是網上一大堆的辦法,沒什么好說的。

判別是否是PC版本

這里涉及一個判別是否是 pc 版本的小程序的問題,看下面代碼

wx.getSystemInfo({
      success:function(res){
        that.setData({
          systemInfo:res,
        })
        if(res.platform == "devtools"){
            //開發者工具
        }else if(res.platform == "ios"){
            //IOS
        }else if(res.platform == "android"){
            //android
        }else {
        	//電腦了吧
        }
      }
    })

在使用的地方合理選擇正確的手寫簽名頁面就可以,這里建議分別做兩個頁面,別把功能耦合在一起。

注意事項

  • 真機調試有問題,真機調試 SelectorQuery.exec 方法不執行回調,太坑了。要查看的話使用預覽吧,預覽是沒問題的。

  • 還有就是橫豎屏問題,我這設置的橫屏實際顯示的豎屏,可以在全局設置窗口改變吧,我就不動了。

  • 最后就是樣式問題,為什么我的圖標不行了?這里注意下 rpx 值的變化,這里是豎屏,在橫屏情況下值更大,看起來效果好。

讀到這里,這篇“小程序canvas手寫簽名適配PC怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

临泽县| 延安市| 神农架林区| 牟定县| 娄烦县| 洛浦县| 东源县| 南丰县| 阿巴嘎旗| 察隅县| 资阳市| 肥西县| 宾川县| 进贤县| 林周县| 鄂尔多斯市| 普安县| 台南市| 鄂伦春自治旗| 应用必备| 阜阳市| 荔波县| 陆丰市| 柳州市| 宜春市| 中江县| 景德镇市| 铁力市| 鄂托克前旗| 黑河市| 锡林浩特市| 隆化县| 宾川县| 龙海市| 鸡泽县| 彭阳县| 沈丘县| 姜堰市| 淳化县| 太原市| 永丰县|