WeChat-Applet-Canvas implementiert Signaturfunktion

WeChat-Applet-Canvas implementiert Signaturfunktion

Im WeChat-Applet-Projekt umfasst das Entwicklungsmodul die Funktion für handschriftliche Signaturen, und das WeChat-Applet-Canvas feiert sein Debüt

Vorwort

WeChat-Applet-Canvas implementiert Signaturfunktion

Einführung in die Kerninhalte:

(1) Signaturimplementierung, Start, Bewegung, Ende

(2) Umschreiben

(3) Vervollständigung

(4) Hochladen

1. WeChat-Applet-Canvas implementiert Signaturfunktion

Wirkungsdemonstration:

(1) Signaturimplementierung

(2) Umschreiben

(3) Vervollständigung

Nach Abschluss das Bild an der entsprechenden Position anzeigen

(4) Je nach Geschäftsbedarf können Sie Bilder in den Hintergrund hochladen und bei Bedarf anzeigen.

2. Code

1. Alle Demos

wxml

<!--pages/canvas-test/canvas-test.wxml-->

<Ansichtsklasse="handCenter">

 <canvas class="handWriting" disable-scroll="true" bindtouchstart="uploadScaleStart" bindtouchmove="uploadScaleMove"
 bindtouchend="uploadScaleEnd" bindtap="mouseDown" canvas-id="handWriting">
 </Leinwand>

</Ansicht>


<Ansichtsklasse="handBtn">
 <button catchtap="retDraw" class="delBtn">Umschreiben</button>
 <button catchtap="subCanvas" class="subBtn">Fertig</button> 
</Ansicht>


<Klasse anzeigen="Vorschau"> 

 <Bild wx:if="{{tmpPath}}" Stil="Breite:100%;Höhe:100%;" src="{{tmpPath}}"></Bild>

</Ansicht>

js

const app = getApp()
const api = require('../../utils/request.js'); //relativer Pfad const apiEev = require('../../config/config');
Seite({
 Daten: {
 Canvasname: 'Handschrift',
 ctx: '',
 Leinwandbreite: 0,
 Leinwandhöhe: 0,
 transparent: 1, // Transparenz selectColor: 'schwarz',
 lineColor: '#1A1A1A', // Farbe lineSize: 1.5, // mehrere beachten lineMin: 0.5, // minimaler Strichradius lineMax: 4, // maximaler Strichradius pressure: 1, // Standarddruck smoothness: 60, // Glätte, 60 % Distanz zur Berechnung der Geschwindigkeit verwenden currentPoint: {},
 currentLine: [], // Aktuelle Zeile firstTouch: true, // Erster Trigger radius: 1, // Radius des Kreises cutArea: { top: 0, right: 0, bottom: 0, left: 0 }, // Schnittbereich bethelPoint: [], // Speichert die von allen Zeilen erzeugten Bézierpunkte;
 letzterPunkt: 0,
 chirography: [], //HandschriftcurrentChirography: {}, //aktuelle HandschriftlinePrack: [], //Linienbahn, tatsächlicher Punkt der generierten LinietmpPath:''
 },
 // Handschrift start uploadScaleStart (e) {
 wenn (e.Typ != 'touchstart') false zurückgibt;
 lass ctx = diese.Daten.ctx;
 ctx.setFillStyle(this.data.lineColor); // Anfängliche Linienfarbeinstellung ctx.setGlobalAlpha(this.data.transparent); // Transparenz festlegen let currentPoint = {
 x: e.berührt[0].x,
 y: e.berührt[0].y
 }
 lass aktuelleLinie = diese.Daten.aktuelleLinie;
 currentLine.unshift({
 Zeit: neues Date().getTime(),
 Anzahl: 0,
 x: aktuellerPunkt.x,
 y: aktuellerPunkt.y
 })
 dies.setData({
 aktueller Punkt,
 // aktuelle Zeile
 })
 wenn (diese.Daten.firstTouch) {
 dies.setData({
 Schnittbereich: { oben: currentPoint.y, rechts: currentPoint.x, unten: currentPoint.y, links: currentPoint.x },
 firstTouch: falsch
 })
 }
 dies.pointToLine(aktuelleLinie);
 },
 // Handschriftbewegung uploadScaleMove (e) {
 wenn (e.Typ != 'touchmove') false zurückgibt;
 wenn (z. B. stornierbar) {
 // Prüfen, ob das Standardverhalten deaktiviert wurde if (!e.defaultPrevented) {
 e.preventDefault();
 }
 }
 lass Punkt = {
 x: e.berührt[0].x,
 y: e.berührt[0].y
 }

 //Schneiden testen if (point.y < this.data.cutArea.top) {
 this.data.cutArea.top = Punkt.y;
 }
 wenn (Punkt.y < 0) this.data.cutArea.top = 0;

 wenn (Punkt.x > diese.Daten.Schnittfläche.rechts) {
 this.data.cutArea.right = Punkt.x;
 }
 wenn (this.data.canvasWidth - point.x <= 0) {
 diese.data.cutArea.right = diese.data.canvasWidth;
 }
 wenn (Punkt.y > diese.Daten.Schnittfläche.unten) {
 this.data.cutArea.bottom = Punkt.y;
 }
 wenn (this.data.canvasHeight - point.y <= 0) {
 diese.Daten.cutArea.bottom = diese.Daten.canvasHeight;
 }
 wenn (Punkt.x < diese.Daten.Schnittfläche.links) {
 this.data.cutArea.left = Punkt.x;
 }
 wenn (Punkt.x < 0) this.data.cutArea.left = 0;

 dies.setData({
 letzterPunkt: diese.Daten.aktuellerPunkt,
 aktuellerPunkt: Punkt
 })
 let currentLine = diese.Daten.currentLine
 currentLine.unshift({
 Zeit: neues Date().getTime(),
 dis: diese.Entfernung(diese.Daten.aktuellerPunkt, diese.Daten.letzterPunkt),
 x: Punkt.x,
 y: Punkt.y
 })
 // dies.setData({
 // aktuelle Zeile
 // })
 dies.pointToLine(aktuelleLinie);
 },
 // Die Handschrift endet uploadScaleEnd (e) {
 wenn (e.Typ != 'touchend') 0 zurückgibt;
 lass Punkt = {
 x: e.changedTouches[0].x,
 y: e.changedTouches[0].y
 }
 dies.setData({
 letzterPunkt: diese.Daten.aktuellerPunkt,
 aktuellerPunkt: Punkt
 })
 let currentLine = diese.Daten.currentLine
 currentLine.unshift({
 Zeit: neues Date().getTime(),
 dis: diese.Entfernung(diese.Daten.aktuellerPunkt, diese.Daten.letzterPunkt),
 x: Punkt.x,
 y: Punkt.y
 })
 // dies.setData({
 // aktuelle Zeile
 // })
 wenn (aktuelleZeilenlänge > 2) {
 var info = (aktuelleZeile[0].Zeit - aktuelleZeile[aktuelleZeile.Länge - 1].Zeit) / aktuelleZeile.Länge;
 //$("#info").text(info.toFixed(2));
 }
 //Nachdem ein Strich abgeschlossen ist, speichere die Koordinatenpunkte der Handschrift, lösche sie und füge eine Prüfung hinzu, um festzustellen, ob sich die aktuelle Handschrift im Handschriftbereich befindet.
 dies.pointToLine(aktuelleLinie);
 var aktuelleChirographie = {
 Zeilengröße: this.data.lineSize,
 Linienfarbe: this.data.lineColor
 };
 var chirography = diese.Daten.chirography
 chirography.unshift(aktuelleChirographie);
 dies.setData({
 Chirographie
 })
 var linePrack = diese.Daten.linePrack
 linePrack.unshift(diese.Daten.aktuelleZeile);
 dies.setData({
 LiniePrack,
 aktuelleZeile: []
 })
 },
 beim Laden () {
 let canvasName = this.data.canvasName
 let ctx = wx.createCanvasContext(Leinwandname)
 dies.setData({
 ctx: ctx
 })
 var query = wx.createSelectorQuery();
 Abfrage.Select('.handCenter').boundingClientRect(rect => {
 dies.setData({
 Leinwandbreite: rechteckige Breite,
 Leinwandhöhe: rechteckige Höhe
 })
 }).exec();
 },

 unterLeinwand(){
 // Füge mein let hinzu = dies
 lass ctx = diese.Daten.ctx;
 ctx.draw(true,setTimeout(function(){ //Mein neuer Timer und Rückruf wx.canvasToTempFilePath({
 x: 0,
 y: 0,
 Breite: 375,
 Höhe: 152,
 CanvasId: "Handschrift",
 Dateityp: "png",
 Erfolg: Funktion (Res) {
 dass.setData({
 tmpPfad:res.tempFilePath
 })
 console.log(that.data.tmpPath,'sehen, was es ist')
 das.upImgs(das.data.tmpPath,0)
 }
 }, ctx)
 },1000))
 },

// Füge den Pfad zum Hochladen des gespeicherten Bildes auf den Dateiserver hinzu upImgs: function (imgurl, index) {
 console.log(imgurl,'siehe den Pfad')
 var das = dies;
 wx.uploadDatei({
 url: apiEev.api + 'xxxx', //Hintergrund-Upload-Pfad filePath: imgurl,
 Name: "Datei",
 Kopfzeile: {
 „Inhaltstyp“: „multipart/Formulardaten“
 },
 formData: null,
 Erfolg: Funktion (res) {
 console.log(res) //Schnittstelle gibt Netzwerkpfad zurück var data = JSON.parse(res.data)
 console.log(data,'sehen, was Daten sind')
 wenn (data.code == "erfolg") {
 console.log('Erfolg')
 }
 }
 })
},


 retDraw() {
 diese.Daten.ctx.clearRect(0, 0, 700, 730)
 diese.Daten.ctx.draw()
 dies.setData({
 tmpPfad:''
 })
 },
 

 //Zeichnen Sie eine Linie zwischen zwei Punkten. Der Parameter lautet: Linie, wodurch die beiden nächstgelegenen Startpunkte gezeichnet werden.
 pointToLine (Linie) {
 this.calcBethelLine(Zeile);
 zurückkehren;
 },
 //Berechnen Sie die Interpolationsmethode;
 calcBethelLine (Zeile) {
 if (Zeilenlänge <= 1) {
 Zeile[0].r = diese.Daten.Radius;
 zurückkehren;
 }
 sei x0, x1, x2, y0, y1, y2, r0, r1, r2, Länge, letzterRadius, dis = 0, Zeit = 0, Kurvenwert = 0,5;
 if (Zeilenlänge <= 2) {
 x0 = Zeile[1].x
 y0 = Zeile[1].y
 x2 = Zeile[1].x + (Zeile[0].x - Zeile[1].x) * Kurvenwert;
 y2 = Linie[1].y + (Linie[0].y - Linie[1].y) * Kurvenwert;
 //x2 = Zeile[1].x;
 //y2 = zeile[1].y;
 x1 = x0 + (x2 - x0) * Kurvenwert;
 y1 = y0 + (y2 - y0) * Kurvenwert;;

 } anders {
 x0 = Zeile[2].x + (Zeile[1].x - Zeile[2].x) * Kurvenwert;
 y0 = Linie[2].y + (Linie[1].y - Linie[2].y) * Kurvenwert;
 x1 = Zeile[1].x;
 y1 = Zeile[1].y;
 x2 = x1 + (Linie[0].x - x1) * Kurvenwert;
 y2 = y1 + (Linie[0].y - y1) * Kurvenwert;
 }
 //Aus der Berechnungsformel ergeben sich die drei Punkte (x0, y0), (x1, y1), (x2, y2); (x1, y1) ist der Kontrollpunkt, der nicht auf die Kurve fällt. Tatsächlich ist dieser Punkt auch der tatsächlich durch Handschrift erhaltene Punkt, aber er fällt auf die Kurve len = this.distance({ x: x2, y: y2 }, { x: x0, y: y0 });
 letzterRadius = dieser.Datenradius;
 für (let n = 0; n < Zeilenlänge - 1; n++) {
 dis += Zeile[n].dis;
 Zeit += Zeile[n].Zeit - Zeile[n + 1].Zeit;
 wenn (dis > diese.Daten.Glattheit) abbrechen;
 }
 dies.setData({
 Radius: Math.min(Zeit / Länge * dieser.Datendruck + dieses.Datenzeilenmin, dieses.Datenzeilenmax) * diese.Datenzeilengröße
 });
 Zeile[0].r = diese.Daten.Radius;
 //Berechnen Sie den Handschriftradius;
 if (Zeilenlänge <= 2) {
 r0 = (letzterRadius + dieser.Datenradius) / 2;
 r1 = r0;
 r2 = r1;
 //zurückkehren;
 } anders {
 r0 = (Zeile[2].r + Zeile[1].r) / 2;
 r1 = Zeile[1].r;
 r2 = (Zeile[1].r + Zeile[0].r) / 2;
 }
 sei n = 5;
 lass Punkt = [];
 für (sei i = 0; i < n; i++) {
 sei t = i / (n – 1);
 sei x = (1 - t) * (1 - t) * x0 + 2 * t * (1 - t) * x1 + t * t * x2;
 sei y = (1 – t) * (1 – t) * y0 + 2 * t * (1 – t) * y1 + t * t * y2;
 sei r = letzterRadius + (this.data.radius - letzterRadius) / n * i;
 Punkt.drücken({ x: x, y: y, r: r });
 wenn (Punkt.Länge == 3) {
 sei a = this.ctaCalc(Punkt[0].x, Punkt[0].y, Punkt[0].r, Punkt[1].x, Punkt[1].y, Punkt[1].r, Punkt[2].x, Punkt[2].y, Punkt[2].r);
 a[0].color = diese.Daten.Zeilenfarbe;
 // lass bethelPoint = diese.Daten.bethelPoint;
 // konsole.log(a)
 // Konsole.log(diese.Daten.bethelPoint)
 // bethelPoint = bethelPoint.push(a);
 dies.bethelDraw(a, 1);
 Punkt = [{ x: x, y: y, r: r }];
 }
 }
 dies.setData({
 currentLine: Zeile
 })
 },
 // Bestimme den Abstand zwischen zwei Punkten distance (a, b) {
 sei x = bx - ax;
 sei y = by - ay;
 gibt Math.sqrt(x * x + y * y) zurück;
 },
 ctaCalc (x0, y0, r0, x1, y1, r1, x2, y2, r2) {
 sei a = [], vx01, vy01, Norm, n_x0, n_y0, vx21, vy21, n_x2, n_y2;
 vx01 = x1 - x0;
 vy01 = y1 - y0;
 Norm = Math.sqrt(vx01 * vx01 + vy01 * vy01 + 0,0001) * 2;
 vx01 = vx01 / Norm * r0;
 vy01 = vy01 / Norm * r0;
 n_x0 = vy01;
 n_y0 = -vx01;
 vx21 = x1 - x2;
 vy21 = y1 - y2;
 Norm = Math.sqrt(vx21 * vx21 + vy21 * vy21 + 0,0001) * 2;
 vx21 = vx21 / Norm * r2;
 vy21 = vy21 / Norm * r2;
 n_x2 = -vy21;
 n_y2 = vx21;
 a.push({ mx: x0 + n_x0, my: y0 + n_y0, Farbe: "#1A1A1A" });
 a.push({ c1x: x1 + n_x0, c1y: y1 + n_y0, c2x: x1 + n_x2, c2y: y1 + n_y2, zB: x2 + n_x2, ey: y2 + n_y2 });
 a.push({ c1x: x2 + n_x2 - vx21, c1y: y2 + n_y2 - vy21, c2x: x2 - n_x2 - vx21, c2y: y2 - n_y2 - vy21, Beispiel: x2 - n_x2, ey: y2 - n_y2 });
 a.push({ c1x: x1 - n_x2, c1y: y1 - n_y2, c2x: x1 - n_x0, c2y: y1 - n_y0, zB: x0 - n_x0, ey: y0 - n_y0 });
 a.push({ c1x: x0 - n_x0 - vx01, c1y: y0 - n_y0 - vy01, c2x: x0 + n_x0 - vx01, c2y: y0 + n_y0 - vy01, Beispiel: x0 + n_x0, ey: y0 + n_y0 });
 a[0].mx = a[0].mx.toFixed(1);
 a[0].mx = parseFloat(a[0].mx);
 a[0].my = a[0].my.toFixed(1);
 a[0].mein = parseFloat(a[0].mein);
 für (sei i = 1; i < a.Länge; i++) {
 a[i].c1x = a[i].c1x.toFixed(1);
 a[i].c1x = parseFloat(a[i].c1x);
 a[i].c1y = a[i].c1y.toFixed(1);
 a[i].c1y = parseFloat(a[i].c1y);
 a[i].c2x = a[i].c2x.toFixed(1);
 a[i].c2x = parseFloat(a[i].c2x);
 a[i].c2y = a[i].c2y.toFixed(1);
 a[i].c2y = parseFloat(a[i].c2y);
 a[i].ex = a[i].ex.toFixed(1);
 a[i].ex = parseFloat(a[i].ex);
 a[i].ey = a[i].ey.toFixed(1);
 a[i].ey = parseFloat(a[i].ey);
 }
 gib a zurück;
 },
 bethelDraw (Punkt, ist_Füllung, Farbe) {
 // Füge mein let hinzu = dies
 lass ctx = diese.Daten.ctx;
 ctx.beginPath();
 ctx.moveTo(Punkt[0].mx, Punkt[0].my);
 if (undefiniert != Farbe) {
 ctx.setFillStyle(Farbe);
 ctx.setStrokeStyle(Farbe);
 } anders {
 ctx.setFillStyle(Punkt[0].Farbe);
 ctx.setStrokeStyle(Punkt[0].Farbe);
 }
 für (lass i = 1; i < Punkt.Länge; i++) {
 ctx.bezierCurveTo(Punkt[i].c1x, Punkt[i].c1y, Punkt[i].c2x, Punkt[i].c2y, Punkt[i].ex, Punkt[i].ey);
 }
 ctx.stroke();
 if (undefiniert != is_fill) {
 ctx.fill(); //Grafiken füllen (die später gezeichneten Grafiken überdecken die vorherigen Grafiken, achte beim Zeichnen auf die Reihenfolge)
 }
 ctx.draw(wahr)
 },
 selectColorEvent (Ereignis) {
 console.log(Ereignis)
 var Farbe = Ereignis.aktuellesTarget.dataset.colorValue;
 var colorSelected = event.currentTarget.dataset.color;
 dies.setData({
 Farbe auswählen: FarbeAusgewählt,
 Linienfarbe: Farbe
 })
 }
})
/* Seiten/Canvas-Test2/Canvas-Test2.wxss */
.canvasId {
 Position: absolut;
 links: 50%;
 oben: 0;
 transformieren: übersetzen (-50 %);
 Z-Index: 1;
 Rand: 2px gestrichelt #ccc;
 Rahmenradius: 8px;
 Rand unten: 66px;
}

.handCenter {
 Rand: 1px durchgehend rot;
}

.handWriting {
 Breite: 100 %;
}

.Vorschau {
 Breite: 375px;
 Höhe: 152px;
}

2. Analyse der Schlüsselteile

(1) Grundlegende Implementierung von Signatur, Start, Verschiebung und Ende

// Handschrift start uploadScaleStart (e) {
 wenn (e.Typ != 'touchstart') false zurückgibt;
 lass ctx = diese.Daten.ctx;
 ctx.setFillStyle(this.data.lineColor); // Anfängliche Linienfarbeinstellung ctx.setGlobalAlpha(this.data.transparent); // Transparenz festlegen let currentPoint = {
 x: e.berührt[0].x,
 y: e.berührt[0].y
 }
 lass aktuelleLinie = diese.Daten.aktuelleLinie;
 currentLine.unshift({
 Zeit: neues Date().getTime(),
 Anzahl: 0,
 x: aktuellerPunkt.x,
 y: aktuellerPunkt.y
 })
 dies.setData({
 aktueller Punkt,
 // aktuelle Zeile
 })
 wenn (diese.Daten.firstTouch) {
 dies.setData({
 Schnittbereich: { oben: currentPoint.y, rechts: currentPoint.x, unten: currentPoint.y, links: currentPoint.x },
 firstTouch: falsch
 })
 }
 dies.pointToLine(aktuelleLinie);
 },
 // Handschriftbewegung uploadScaleMove (e) {
 wenn (e.Typ != 'touchmove') false zurückgibt;
 wenn (z. B. stornierbar) {
 // Prüfen, ob das Standardverhalten deaktiviert wurde if (!e.defaultPrevented) {
 e.preventDefault();
 }
 }
 lass Punkt = {
 x: e.berührt[0].x,
 y: e.berührt[0].y
 }

 //Schneiden testen if (point.y < this.data.cutArea.top) {
 this.data.cutArea.top = Punkt.y;
 }
 wenn (Punkt.y < 0) this.data.cutArea.top = 0;

 wenn (Punkt.x > diese.Daten.Schnittfläche.rechts) {
 this.data.cutArea.right = Punkt.x;
 }
 wenn (this.data.canvasWidth - point.x <= 0) {
 diese.data.cutArea.right = diese.data.canvasWidth;
 }
 wenn (Punkt.y > diese.Daten.Schnittfläche.unten) {
 this.data.cutArea.bottom = Punkt.y;
 }
 wenn (this.data.canvasHeight - point.y <= 0) {
 diese.Daten.cutArea.bottom = diese.Daten.canvasHeight;
 }
 wenn (Punkt.x < diese.Daten.Schnittfläche.links) {
 this.data.cutArea.left = Punkt.x;
 }
 wenn (Punkt.x < 0) this.data.cutArea.left = 0;

 dies.setData({
 letzterPunkt: diese.Daten.aktuellerPunkt,
 aktuellerPunkt: Punkt
 })
 let currentLine = diese.Daten.currentLine
 currentLine.unshift({
 Zeit: neues Date().getTime(),
 dis: diese.Entfernung(diese.Daten.aktuellerPunkt, diese.Daten.letzterPunkt),
 x: Punkt.x,
 y: Punkt.y
 })
 // dies.setData({
 // aktuelle Zeile
 // })
 dies.pointToLine(aktuelleLinie);
 },
 // Die Handschrift endet uploadScaleEnd (e) {
 wenn (e.Typ != 'touchend') 0 zurückgibt;
 lass Punkt = {
 x: e.changedTouches[0].x,
 y: e.changedTouches[0].y
 }
 dies.setData({
 letzterPunkt: diese.Daten.aktuellerPunkt,
 aktuellerPunkt: Punkt
 })
 let currentLine = diese.Daten.currentLine
 currentLine.unshift({
 Zeit: neues Date().getTime(),
 dis: diese.Entfernung(diese.Daten.aktuellerPunkt, diese.Daten.letzterPunkt),
 x: Punkt.x,
 y: Punkt.y
 })
 // dies.setData({
 // aktuelle Zeile
 // })
 wenn (aktuelleZeilenlänge > 2) {
 var info = (aktuelleZeile[0].Zeit - aktuelleZeile[aktuelleZeile.Länge - 1].Zeit) / aktuelleZeile.Länge;
 //$("#info").text(info.toFixed(2));
 }
 //Nachdem ein Strich abgeschlossen ist, speichere die Koordinatenpunkte der Handschrift, lösche sie und füge eine Prüfung hinzu, um festzustellen, ob sich die aktuelle Handschrift im Handschriftbereich befindet.
 dies.pointToLine(aktuelleLinie);
 var aktuelleChirographie = {
 Zeilengröße: this.data.lineSize,
 Linienfarbe: this.data.lineColor
 };
 var chirography = diese.Daten.chirography
 chirography.unshift(aktuelleChirographie);
 dies.setData({
 Chirographie
 })
 var linePrack = diese.Daten.linePrack
 linePrack.unshift(diese.Daten.aktuelleZeile);
 dies.setData({
 LiniePrack,
 aktuelleZeile: []
 })
},

Denken Sie daran, zuerst in Onload zu initialisieren

Nimm den Code und verwende ihn direkt

(2) Neusignierung

Im Klartext bedeutet es, die Leinwand zu leeren.

retDraw() {
 diese.Daten.ctx.clearRect(0, 0, 700, 730)
 diese.Daten.ctx.draw()
 dies.setData({
 tmpPfad:''
 })
},

(3) Unterschrift erfolgt

unterLeinwand(){
 // Füge mein let hinzu = dies
 lass ctx = diese.Daten.ctx;
 ctx.draw(true,setTimeout(function(){ //Mein neuer Timer und Rückruf wx.canvasToTempFilePath({
 x: 0,
 y: 0,
 Breite: 375,
 Höhe: 152,
 CanvasId: "Handschrift",
 Dateityp: "png",
 Erfolg: Funktion (Res) {
 dass.setData({
 tmpPfad:res.tempFilePath
 })
 console.log(that.data.tmpPath,'sehen, was es ist')
 das.upImgs(das.data.tmpPath,0)
 }
 }, ctx)
 },1000))
 },

Wichtiger ist der darin enthaltene Rückruf:

Um zu verhindern, dass der Canvas-Inhalt verloren geht, können Sie eine Verzögerung einstellen;
Die Methode wx.canvasToTempFilePath ruft den Canvas-Bildinhalt ab.

(4) Je nach Geschäftsbedarf können Sie Bilder in den Hintergrund hochladen und bei Bedarf anzeigen.

Der entscheidende Punkt ist, wie in den Hintergrund hochgeladen wird

// Füge den Pfad zum Hochladen des gespeicherten Bildes auf den Dateiserver hinzu upImgs: function (imgurl, index) {
 console.log(imgurl,'siehe den Pfad')
 var das = dies;
 wx.uploadDatei({
 url: apiEev.api + 'xxxx', //Hintergrunddatei-Uploadpfad Schnittstelle filePath: imgurl,
 Name: "Datei",
 Kopfzeile: {
 „Inhaltstyp“: „multipart/Formulardaten“
 },
 formData: null,
 Erfolg: Funktion (res) {
 console.log(res) //Schnittstelle gibt Netzwerkpfad zurück var data = JSON.parse(res.data)
 console.log(data,'sehen, was Daten sind')
 wenn (data.code == "erfolg") {
 console.log('Erfolg')
 }
 }
 })
},

Zusammenfassen

Die WeChat-Miniprogramm-Canvas implementiert die Signaturfunktion.

Besonderer Hinweis: Beim Debuggen und der Erfahrungsversion auf der realen Maschine kann es zu Verzögerungen kommen. Wenn möglich, veröffentlichen Sie es in der Vorabversion, um zu sehen, ob es die Leistung beeinträchtigt.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Uniapp implementiert den elektronischen Signatureffekt des WeChat-Applets (mit Demo)
  • Beispielcode zur Implementierung einer handschriftlichen Signatur im WeChat-Applet
  • Das WeChat-Applet implementiert eine einfache handschriftliche Signaturkomponente
  • WeChat-Miniprogramm zur Implementierung elektronischer Signaturen
  • Das WeChat Mini-Programm implementiert die Funktion für elektronische Signaturen
  • WeChat-Applet implementiert elektronische Signatur und exportiert Bilder
  • Java hat bei WeChat-Applet die Problemlösung „Zahlungsüberprüfungssignatur fehlgeschlagen“ festgestellt
  • Überprüfung und Entschlüsselungscode für die Benutzerdatensignatur des .NET WeChat-Applets
  • Das WeChat-Applet implementiert die horizontale und vertikale Bildschirmsignaturfunktion

<<:  Eine kurze Diskussion über den magischen Schrägstrich im Nginx Reverse Proxy

>>:  Tutorial zum Anmelden bei MySQL nach der Installation von Mysql 5.7.17

Artikel empfehlen

Lernhinweise zum WeChat-Applet: Seitenkonfiguration und -routing

Ich habe kürzlich die Entwicklung kleiner Program...

MySQL mit Nutzungsanalyse

Verwendung von „haben“ Mit der Having-Klausel kön...

So verwenden Sie den Linux-Befehl seq

1. Befehlseinführung Mit dem Befehl seq (Sequence...

So zeigen Sie den Kennwortablauf unter Linux an und konfigurieren ihn

Mit den richtigen Einstellungen können Sie Linux-...

Mehrere Methoden zum Ausführen von SQL-Dateien unter der MySQL-Befehlszeile

Inhaltsverzeichnis Die erste Methode: Wenn die My...

Detaillierte Erklärung des Befehlsmodus in der Javascript-Praxis

Inhaltsverzeichnis Definition Struktur Beispiele ...

Data URI und MHTML Komplettlösung für alle Browser

Daten-URI Data URI ist ein durch RFC 2397 definie...

Docker-Praxis: Python-Anwendungscontainerisierung

1. Einleitung Container nutzen einen Sandbox-Mech...

Zusammenfassung der Wissenspunkte zu MySQL-Index, Sperre und Transaktion

Dieser Artikel fasst die Wissenspunkte zu MySql-I...

Allgemeine Verwendung von regulären Ausdrücken in MySQL

Allgemeine Verwendung von Regexp in Mysql Fuzzy-M...