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クライアントが認証プロトコルをサポートしていない問題を解決する

推薦する

MacでのMySQL初期化パスワード操作

Macでデータベースを操作する際に個人が遭遇するデータベース起動の問題の簡単な記録1. Apple-...

ElementUI の this.$notify.close() 呼び出しが機能しない問題の解決方法

目次要件の説明問題の説明問題分析問題解決質問の拡張要件の説明このプロジェクトでは、まずユーザーが質問...

ウェブサイトのユーザビリティを向上させる10のヒント

企業の Web サイト、個人のブログ、ショッピング Web サイト、ゲーム Web サイトなど、どの...

既存のMySQLデータベースの文字セットを統一する方法

序文データベースでは、一部のデータ テーブルとデータは latin1 であり、一部のデータ テーブル...

テキストの折り畳み特殊効果を実現する HTML+CSS の例

この記事では、主に HTML + CSS を使用してテキストの折りたたみ特殊効果を実現する例を紹介し...

CSS中級者向けアダプティブレイアウトの5つのソリューションの詳細な説明

序文ページを作っていく上で、ページレイアウトに関する内容に遭遇することが多く、面接でも聞かれることも...

MySQL/MariaDB でピボット テーブルを実装する方法のサンプル コード

前回の記事では、Oracle でピボット テーブルを実装するいくつかの方法を紹介しました。今日は、同...

Nginx URL 書き換えメカニズムの原理と使用例

URL 書き換えは、Web サイトの優先ドメインを決定するのに役立ちます。同じリソース ページの複数...

htm 初心者ノート(初心者は必ず読んでください)

1. HTMLとは何かHTML (ハイパーテキスト マークアップ言語): ハイパーテキスト マーク...

Vue は PDF.js を統合して PDF プレビューを実装し、透かしを追加する手順を実行します。

目次成果を達成する利用可能なプラグインの紹介ニーズに応じてプラグインを選択するプラグインのインストー...

CSS3 でテキストマーキーを実装するためのサンプルコード

背景何が起こったかというと、Luzhu は偶然、宇宙で最高の外部スピーカーを備えた携帯電話について知...

Ubuntuにmysql5.7.10を手動でインストールする

このチュートリアルでは、UbuntuにMySQL 5.7.10を手動でインストールする手順を参考まで...

Vue2は応答性を提供するためにprovide injectを実装しています

1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...

VMWare に CentOS 7.3 をインストールするグラフィカル チュートリアル

CentOS 7.3のインストール手順を図解しました。具体的な内容は次のとおりです。この記事では、v...

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス...