小程序canvas手寫簽名適配PC實(shí)現(xiàn)示例詳解
引言
繼上一篇的《絲滑流暢的手寫簽名功能》博文才過去沒多久,我才發(fā)現(xiàn) canvas 2d 無法在 PC 的小程序中使用,真實(shí)白費(fèi)了我的優(yōu)化了,還好之前的代碼沒刪掉,原本以為直接簡單改改就能用,發(fā)現(xiàn)還不是,下面看看吧。
先看看效果圖
鼠標(biāo)用起來效果不怎么樣,但是還是挺流暢的。
看看代碼
主要就看看 Page.js 的代碼吧,也就這個(gè)不一樣,當(dāng)然 HTML 內(nèi)的 canvas 標(biāo)簽記得加上 canvas-id,把 type = '2d' 給去掉。
// pages/mine/signature/drawCanvas/drawCanvas.js var app = getApp() Page({ data: { context: null, index: 0, height: 0, width: 0, // 前 一點(diǎn) 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) }); }, /**記錄開始點(diǎn) */ 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 }, /**記錄移動點(diǎn),刷新繪制 */ 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像素的時(shí)候作二階貝塞爾曲線 if (deltaX >= 3 || deltaY >= 3) { // 前后兩點(diǎn)中心點(diǎn) let centerX = (preX + curX) / 2 let centerY = (preY + curY) / 2 //這里以前一點(diǎn)作為控制點(diǎn),中心點(diǎn)作為終點(diǎn),起始點(diǎn)為上一次的中點(diǎn),很流暢?。? 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 }) } })) }, })
下面仔細(xì)講講不同點(diǎn)
- 獲取canvas方式不一樣
這里因?yàn)槭褂玫氖桥f版本的 canvas,所以用的還是原來的方式獲取 canvas 的。
- 屬性值多加了 preCenterX 和 preCenterY
這個(gè)就很奇怪哦,可能是因?yàn)?canvas 的用法不一樣,導(dǎo)致使用貝塞爾曲線的時(shí)候無法正確的定位到前一點(diǎn)位置,也可能是里面的前一點(diǎn)位置就是 canvas 內(nèi)移動時(shí)一系列點(diǎn)中前一個(gè)點(diǎn)的位置,放在就不對,如果按前一篇博客的方式做,出來的就是下面的效果:
這里記得在手指初次落下的時(shí)候,初始化這兩個(gè)值,并在移動后重新賦值。
- 導(dǎo)出圖片方式不一樣
這里就是網(wǎng)上一大堆的辦法,沒什么好說的。
判別是否是PC版本
這里涉及一個(gè)判別是否是 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 { //電腦了吧 } } })
在使用的地方合理選擇正確的手寫簽名頁面就可以,這里建議分別做兩個(gè)頁面,別把功能耦合在一起。
注意事項(xiàng)
- 真機(jī)調(diào)試有問題,真機(jī)調(diào)試 SelectorQuery.exec 方法不執(zhí)行回調(diào),太坑了。要查看的話使用預(yù)覽吧,預(yù)覽是沒問題的。
- 還有就是橫豎屏問題,我這設(shè)置的橫屏實(shí)際顯示的豎屏,可以在全局設(shè)置窗口改變吧,我就不動了。
- 最后就是樣式問題,為什么我的圖標(biāo)不行了?這里注意下 rpx 值的變化,這里是豎屏,在橫屏情況下值更大,看起來效果好。
結(jié)語
試了下沒問題!而且調(diào)試器也是電腦版本,很奇怪為什么它可以使用 canvas 2d,而微信PC版本就不可以,開發(fā)者論壇很多人反饋也不解決。
以上就是小程序canvas手寫簽名適配PC實(shí)現(xiàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于小程序canvas手寫簽名適配PC的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript中產(chǎn)生固定結(jié)果的函數(shù)優(yōu)化技巧
分享一個(gè)Javascript編寫函數(shù)的優(yōu)化技巧;適用的函數(shù)應(yīng)該要滿足以下條件;產(chǎn)生固定結(jié)果;復(fù)雜或較耗時(shí)等等,感興趣的朋友可以了解下2013-01-01form表單中去掉默認(rèn)的enter鍵提交并綁定js方法實(shí)現(xiàn)代碼
form表單中默認(rèn)的enter提交是不是讓你已經(jīng)很耐煩了吧,本文主要講解一下如何去掉默認(rèn)的enter鍵提交同時(shí)綁定js方法,感興趣的朋友可以參考下哈2013-04-04簡單實(shí)現(xiàn)js倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了js倒計(jì)時(shí)效果的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02js中的面向?qū)ο笾畬ο蟪R妱?chuàng)建方法詳解
這篇文章主要介紹了js中的面向?qū)ο笾畬ο蟪R妱?chuàng)建方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了JavaScript創(chuàng)建對象的四種常用方式,需要的朋友可以參考下2019-12-12JavaScript使用HTML5的window.postMessage實(shí)現(xiàn)跨域通信例子
這篇文章主要介紹了JavaScript使用HTML5的window.postMessage實(shí)現(xiàn)跨域通信例子,需要的朋友可以參考下2014-04-04uniapp開發(fā)APP之強(qiáng)制更新和熱更新的實(shí)現(xiàn)
使用uni-app開發(fā),可將代碼編譯到iOS、Android、微信小程序等多個(gè)平臺,升級時(shí)也需考慮多平臺同步升級,下面這篇文章主要給大家介紹了關(guān)于uniapp開發(fā)APP之強(qiáng)制更新和熱更新的相關(guān)資料,需要的朋友可以參考下2022-12-12