背景:プロジェクト中、WeChat アプレットに手書き署名コンポーネントを実装する必要があります。手書き署名を実装するための WeChat ミニプログラムをインターネットで検索しましたが、結果は理想的ではありませんでした。実際のアプリケーションでは、多数のベジェ曲線をリアルタイムで計算するため、遅延が発生する可能性があります。効果は理想的ではありません。つまり、一歩引いて考えると、ペン先や手書きのシミュレーション効果は必要ありません。必要なのは簡単な手書きの署名だけです。 必要:ユーザーはWeChatミニプログラムに署名を手書きできるようになります。 コンポーネント化する必要があります。 効果 1. アイデアWeChat アプレットでは、キャンバス コンポーネントを使用して実装します。ユーザー入力をペンとして考えてみましょう。私たちが描く署名は多くの点から構成されます。しかし、単純な点では線をうまく形成できません。点は線で結ばれる必要もあります。以下は実装コードです。 2. 実装1. ページとスタイルwxml ここでのキャンバス コンポーネントは最新の使用法です。 <ビュークラス="ダッシュボックス"> <view class="btnList"> <van-button size="small" bind:click="clearCanvas">クリア</van-button> </ビュー> <view class="handCenter"> <キャンバス クラス="手書き" スクロールを無効にする="{{true}}" id="手書き" bindtouchstart="スケール開始" bindtouchmove="スケール移動" bindtouchend="スケール終了" bindtap="mouseDown" タイプ = "2d" > </キャンバス> </ビュー> </ビュー> wxss .btnリスト{ 幅: 95%; マージン:0 自動; } 。手書き{ 背景: #fff; 幅: 95%; 高さ:80vh; マージン:0 自動 } 2. 初期化カスタム コンポーネントで使用されるため、キャンバスを取得するときに this ポイントの問題に注意してください。 SelectorQuery の In メソッドを呼び出さない場合、この時点では親コンポーネントを指しているため、カスタム コンポーネント内のキャンバスを取得できません。 成分({ /** * コンポーネントの初期データ */ データ: { キャンバス名:'#handWriting', ctx:''、 キャンバス幅:0, キャンバスの高さ:0, 開始点:{ x:0, y:0, }, 選択色: '黒', lineColor: '#1A1A1A', // 色 lineSize: 1.5, // 複数に注意してください radius: 5, // 円の半径}, 準備ができて(){ キャンバス名を this.data.canvasName とします。 let query = wx.createSelectorQuery().in(this); //カスタムコンポーネントのSelectQueryオブジェクトを取得します。query.select(canvasName) .fields({ ノード: true, サイズ: true }) .exec((res) => { const キャンバス = res[0].node; const ctx = canvas.getContext('2d'); //デバイスのピクセル比を取得します。const dpr = wx.getSystemInfoSync().pixelRatio; // 手書きのずれを防ぐためにキャンバスのサイズを拡大縮小して設定します。canvas.width = res[0].width * dpr; キャンバスの高さをres[0]の高さに合わせる。 ctx.scale(dpr, dpr); ctx.lineJoin="丸め"; this.setData({ctx}); }); クエリ.select('.handCenter').boundingClientRect(rect => { console.log('rect', rect); this.setData({ キャンバス幅:rect.width、 キャンバスの高さ:rect.height }); }).exec(); }, //次のコードを省略します... }); 3. クリックすると成分({ //上記のコードを省略します... メソッド: { スケール開始(イベント){ event.type != 'touchstart' の場合は false を返します。 現在のポイントを{ x: イベント.タッチ[0].x、 y: イベント.タッチ[0].y } this.drawCircle(現在のポイント); this.setData({startPoint:currentPoint}); }, drawCircle(point){//ここではポイントを担当します。let ctx = this.data.ctx; ctx.beginPath(); ctx.fillStyle = this.data.lineColor; // 手書きの太さは円の大きさによって決まります ctx.arc(point.x, point.y, this.data.radius, 0 , 2 * Math.PI); ctx.fill(); ctx.closePath(); }, //次のコードを省略します... } }) 4. 署名成分({ //上記のコードメソッドを省略:{ 描画線(ソースポイント、ターゲットポイント){ ctx = this.data.ctx; とします。 ターゲットポイントに円を描画します。 ctx.beginPath(); ctx.strokeStyle = this.data.lineColor; ctx.lineWidth = this.data.radius * 2; //ここで 2 倍する理由は、線の太さが円の直径と等しくなるようにするためです。ctx.moveTo(sourcePoint.x, sourcePoint.y); ctx.lineTo(ターゲットポイント.x、ターゲットポイント.y); ctx.stroke(); ctx.closePath(); }, clearCanvas(){//キャンバスをクリアします let ctx = this.data.ctx; ctx.rect(0, 0, this.data.canvasWidth, this.data.canvasHeight); ctx.fillStyle = '#FFFFFF'; ctx.fill(); } } }) 結論この手書きの署名は、ビジネス上の緊急時のみに使用されます。最適化したい場合は、ペンストロークのシミュレーションと手書きのシミュレーションから始めることができます。解決する必要がある唯一の問題は、リアルタイムシミュレーション中の遅延です。 WeChatミニプログラムに簡単な手書き署名コンポーネントを実装する方法についての記事はこれで終わりです。WeChatミニプログラムの手書き署名コンポーネントに関するより関連性の高いコンテンツについては、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: テキスト ファイルの並べ替えに役立つ Awk コマンドラインまたはスクリプト (推奨)
>>: Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する
背景日本語を学び始めた当初は、日本語の50音を覚えるのは簡単ではなく、特にカタカナを覚えるのは困難で...
1. ノーフープハングアップ信号を無視してプログラムを実行する追加メモnohup コマンドは、ハン...
ウェブサイト機能を開発する場合、セッション キャッシュを時間内にクリアできません。一連の探索が始まり...
最近、Vue プロジェクトではデータをリアルタイムで更新する必要があります。折れ線グラフは 1 秒ご...
データのエクスポートエラーを報告する 「secure_file_priv」のような変数を表示します。...
親ファイル React をインポートし、{useState} を 'react' か...
目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...
1. CPU使用率sar -p (一日中表示) sar -u 1 10 (1: 1秒ごと、10: 1...
目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...
MySQL 8.0.21のインストールと設定方法を記録してみんなで共有します。 1. ダウンロード1...
1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...
この記事では、MySQL マスター/スレーブ データベースの構築方法について説明します。ご参考までに...
例: nginx ログには、アクセス ログとエラー ログの 2 つの主な種類があります。アクセス ロ...
テーブルが 2 つあり、テーブル A のレコードがテーブル B に存在しない可能性があります。左結合...
目次addEventListener が必要な理由は何ですか? addEventListener を...