91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信小程序怎么實現一個手寫簽名組件

發布時間:2021-07-11 12:17:27 來源:億速云 閱讀:1084 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關微信小程序怎么實現一個手寫簽名組件,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

背景:

在做項目過程中,需要在微信小程序中實現手寫簽名組件。在網上找了微信小程序手寫簽名實現,但是都是不太理想。在實際運用中,會因為實時計算較多的貝塞爾曲線而產生卡頓。效果不理想。所以退一步,不需要筆鋒以及筆跡模擬效果。只需要簡單的手寫簽名實現。

需求:

可以實現用戶在微信小程序上手寫簽名。

需要組件化。

一、思路

在微信小程序中,我們使用canvas組件實現。將用戶的輸入想象成為一只筆。我們要畫的簽名是由很多點構成的。但是單純的點是不能很好地構成線。點與點之間還要由線連接。下面是實現過程代碼。

二、實現

1. 頁面與樣式

wxml

這里的canvas組件是最新的用法。

<view class="dashbox">
  <view class="btnList">
    <van-button size="small" bind:click="clearCanvas">清空</van-button>
  </view>
  <view class="handCenter">
    <canvas 
      class="handWriting" 
      disable-scroll="{{true}}" 
      id="handWriting"
      bindtouchstart="scaleStart"
      bindtouchmove="scaleMove" 
      bindtouchend="scaleEnd"
      bindtap="mouseDown"
      type="2d"
    >
    </canvas>
  </view>
</view>

wxss

.btnList{
    width: 95%;
    margin:0 auto;
}
.handWriting{
    background: #fff;
    width: 95%;
    height: 80vh;
    margin:0 auto
}

2. 初始化

由于是在自定義組件中使用,所以要注意獲取canvas的時候的this指向問題。如果不調用SelectorQuery的In方法,那么就在自定義組件獲取不到canvas,因為這個時候指向的父組件。

Component({
 /**
 * 組件的初始數據
 */
    data: {
        canvasName:'#handWriting',
        ctx:'',
        canvasWidth:0,
        canvasHeight:0,
        startPoint:{
            x:0,
            y:0,
        },
        selectColor: 'black',
        lineColor: '#1A1A1A', // 顏色
        lineSize: 1.5,  // 筆記倍數
        radius:5,//畫圓的半徑
    }, 
    ready(){
        let canvasName = this.data.canvasName;
        let query = wx.createSelectorQuery().in(this);//獲取自定義組件的SelectQuery對象
        query.select(canvasName)
        .fields({ node: true, size: true })
        .exec((res) => {
          const canvas = res[0].node;
          const ctx = canvas.getContext('2d');
          //獲取設備像素比
          const dpr = wx.getSystemInfoSync().pixelRatio;
          //縮放設置canvas畫布大小,防止筆跡錯位
          canvas.width = res[0].width * dpr;
          canvas.height = res[0].height * dpr;
          ctx.scale(dpr, dpr);
          ctx.lineJoin="round";
          this.setData({ctx});
        });
  
        query.select('.handCenter').boundingClientRect(rect => {
            console.log('rect', rect);
            this.setData({
                canvasWidth:rect.width,
                canvasHeight:rect.height
            });
        }).exec();
    },
   //省略以下代碼......
});

3. 點擊時

Component({
 //省略以上代碼...
 methods: {
            scaleStart(event){
                if (event.type != 'touchstart') return false;
                let currentPoint = {
                    x: event.touches[0].x,
                    y: event.touches[0].y
                }
                this.drawCircle(currentPoint);
                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. 簽名時

Component({
  //省略以上代碼
  methods:{
 drawLine(sourcePoint, targetPoint){
            let ctx = this.data.ctx;
            this.drawCircle(targetPoint);
            ctx.beginPath();
            ctx.strokeStyle = this.data.lineColor;
            ctx.lineWidth = this.data.radius * 2;//這里乘2是因為線條的粗細要和圓的直徑相等
            ctx.moveTo(sourcePoint.x, sourcePoint.y);
            ctx.lineTo(targetPoint.x, targetPoint.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();
          }
  }
})

上述就是小編為大家分享的微信小程序怎么實現一個手寫簽名組件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彩票| 沭阳县| 密山市| 丰城市| 秭归县| 青阳县| 肇东市| 翼城县| 巴塘县| 德兴市| 通渭县| 常山县| 冷水江市| 昌乐县| 普兰店市| 高州市| 广西| 江源县| 资溪县| 金溪县| 安龙县| 宁陕县| 城市| 嘉义市| 兰州市| 靖宇县| 黄浦区| 中宁县| 武定县| 阳新县| 旌德县| 永平县| 德惠市| 美姑县| 延津县| 西和县| 绥中县| 田林县| 西乌| 南城县| 凤山县|