小程序canvas手寫簽名適配PC實現(xiàn)示例詳解
引言
繼上一篇的《絲滑流暢的手寫簽名功能》博文才過去沒多久,我才發(fā)現(xiàn) canvas 2d 無法在 PC 的小程序中使用,真實白費了我的優(yōu)化了,還好之前的代碼沒刪掉,原本以為直接簡單改改就能用,發(fā)現(xiàn)還不是,下面看看吧。
先看看效果圖

鼠標用起來效果不怎么樣,但是還是挺流暢的。
看看代碼
主要就看看 Page.js 的代碼吧,也就這個不一樣,當(dāng)然 HTML 內(nèi)的 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)
},
/**導(dǎo)出圖片 */
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 的用法不一樣,導(dǎo)致使用貝塞爾曲線的時候無法正確的定位到前一點位置,也可能是里面的前一點位置就是 canvas 內(nèi)移動時一系列點中前一個點的位置,放在就不對,如果按前一篇博客的方式做,出來的就是下面的效果:

這里記得在手指初次落下的時候,初始化這兩個值,并在移動后重新賦值。
- 導(dǎo)出圖片方式不一樣
這里就是網(wǎng)上一大堆的辦法,沒什么好說的。
判別是否是PC版本
這里涉及一個判別是否是 pc 版本的小程序的問題,看下面代碼
wx.getSystemInfo({
success:function(res){
that.setData({
systemInfo:res,
})
if(res.platform == "devtools"){
//開發(fā)者工具
}else if(res.platform == "ios"){
//IOS
}else if(res.platform == "android"){
//android
}else {
//電腦了吧
}
}
})
在使用的地方合理選擇正確的手寫簽名頁面就可以,這里建議分別做兩個頁面,別把功能耦合在一起。
注意事項
- 真機調(diào)試有問題,真機調(diào)試 SelectorQuery.exec 方法不執(zhí)行回調(diào),太坑了。要查看的話使用預(yù)覽吧,預(yù)覽是沒問題的。
- 還有就是橫豎屏問題,我這設(shè)置的橫屏實際顯示的豎屏,可以在全局設(shè)置窗口改變吧,我就不動了。
- 最后就是樣式問題,為什么我的圖標不行了?這里注意下 rpx 值的變化,這里是豎屏,在橫屏情況下值更大,看起來效果好。
結(jié)語
試了下沒問題!而且調(diào)試器也是電腦版本,很奇怪為什么它可以使用 canvas 2d,而微信PC版本就不可以,開發(fā)者論壇很多人反饋也不解決。

以上就是小程序canvas手寫簽名適配PC實現(xiàn)示例詳解的詳細內(nèi)容,更多關(guān)于小程序canvas手寫簽名適配PC的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript中產(chǎn)生固定結(jié)果的函數(shù)優(yōu)化技巧
分享一個Javascript編寫函數(shù)的優(yōu)化技巧;適用的函數(shù)應(yīng)該要滿足以下條件;產(chǎn)生固定結(jié)果;復(fù)雜或較耗時等等,感興趣的朋友可以了解下2013-01-01
form表單中去掉默認的enter鍵提交并綁定js方法實現(xiàn)代碼
form表單中默認的enter提交是不是讓你已經(jīng)很耐煩了吧,本文主要講解一下如何去掉默認的enter鍵提交同時綁定js方法,感興趣的朋友可以參考下哈2013-04-04
js中的面向?qū)ο笾畬ο蟪R妱?chuàng)建方法詳解
這篇文章主要介紹了js中的面向?qū)ο笾畬ο蟪R妱?chuàng)建方法,結(jié)合實例形式較為詳細的分析了JavaScript創(chuàng)建對象的四種常用方式,需要的朋友可以參考下2019-12-12
JavaScript使用HTML5的window.postMessage實現(xiàn)跨域通信例子
這篇文章主要介紹了JavaScript使用HTML5的window.postMessage實現(xiàn)跨域通信例子,需要的朋友可以參考下2014-04-04
uniapp開發(fā)APP之強制更新和熱更新的實現(xiàn)
使用uni-app開發(fā),可將代碼編譯到iOS、Android、微信小程序等多個平臺,升級時也需考慮多平臺同步升級,下面這篇文章主要給大家介紹了關(guān)于uniapp開發(fā)APP之強制更新和熱更新的相關(guān)資料,需要的朋友可以參考下2022-12-12

