WeChatアプレットはシンプルな手書き署名コンポーネントを実装します

WeChatアプレットはシンプルな手書き署名コンポーネントを実装します

背景:

プロジェクト中、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を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Uniapp が WeChat アプレットの電子署名効果を実装 (デモ付き)
  • WeChat アプレットに手書き署名を実装するためのサンプル コード
  • 電子署名を実装するWeChatミニプログラム
  • WeChatアプレットキャンバスが署名機能を実装
  • WeChatミニプログラムが電子署名機能を実装
  • WeChatアプレットは電子署名を実装し、画像をエクスポートします
  • Java が WeChat アプレット「支払い検証署名に失敗しました」問題に遭遇した解決策
  • .NET WeChat アプレットのユーザーデータ署名検証および復号化コード
  • WeChatアプレットが横画面と縦画面の署名機能を実装

<<:  テキスト ファイルの並べ替えに役立つ Awk コマンドラインまたはスクリプト (推奨)

>>:  Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する

推薦する

Gokudōゲームにおけるフロントエンド知識のまとめ

背景日本語を学び始めた当初は、日本語の50音を覚えるのは簡単ではなく、特にカタカナを覚えるのは困難で...

Linux のバックグラウンドで実行するいくつかの方法 (まとめ)

1. ノーフープハングアップ信号を無視してプログラムを実行する追加メモnohup コマンドは、ハン...

UrlRewriter のキャッシュ問題と関連する一連の調査

ウェブサイト機能を開発する場合、セッション キャッシュを時間内にクリアできません。一連の探索が始まり...

Vue+WebSocket ページでの長時間接続のリアルタイム更新

最近、Vue プロジェクトではデータをリアルタイムで更新する必要があります。折れ線グラフは 1 秒ご...

MySQL データベースのインポートとエクスポートのデータ エラーの解決例の説明

データのエクスポートエラーを報告する 「secure_file_priv」のような変数を表示します。...

React 手書きタブ切り替え問題

親ファイル React をインポートし、{useState} を 'react' か...

Nginx の場所に関する一般的なルールの優先順位の問題

目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...

Linux sar コマンドの使用方法とコード例の分析

1. CPU使用率sar -p (一日中表示) sar -u 1 10 (1: 1秒ごと、10: 1...

MySQLはこのような更新文を決して書きません

目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...

MySQL 8.0.21 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.21のインストールと設定方法を記録してみんなで共有します。 1. ダウンロード1...

HTML における Div と table の違い (あらゆる側面から詳細に説明)

1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...

MySQLマスタースレーブデータベース構築方法の詳細な説明

この記事では、MySQL マスター/スレーブ データベースの構築方法について説明します。ご参考までに...

Nginx アクセス ログとエラー ログ パラメータの説明

例: nginx ログには、アクセス ログとエラー ログの 2 つの主な種類があります。アクセス ロ...

SQL の左結合と右結合の原理と例の分析

テーブルが 2 つあり、テーブル A のレコードがテーブル B に存在しない可能性があります。左結合...

JavaScriptのonclickとclickの違いの詳細な説明

目次addEventListener が必要な理由は何ですか? addEventListener を...