Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk melaksanakan fungsi kata laluan gerak isyarat dalam uniapp

Bagaimana untuk melaksanakan fungsi kata laluan gerak isyarat dalam uniapp

王林
王林asal
2023-07-04 10:37:191570semak imbas

Cara melaksanakan fungsi kata laluan gerak isyarat dalam uniapp

Kata laluan gerak isyarat ialah cara biasa untuk membuka kunci telefon mudah alih dan juga boleh digunakan dalam aplikasi mudah alih yang dibangunkan oleh uniapp. Dalam uniapp, kami boleh menggunakan kanvas untuk melukis laluan gerak isyarat dan melaksanakan fungsi kata laluan gerak isyarat dengan memantau operasi gerak isyarat pengguna. Artikel ini akan memperkenalkan cara melaksanakan fungsi kata laluan gerak isyarat dalam uniapp dan memberikan contoh kod yang berkaitan.

  1. Buat struktur halaman

Pertama, kita perlu mencipta struktur halaman yang mengandungi elemen kanvas. Cipta folder GestureLock baharu dalam direktori halaman dan cipta fail GestureLock.vue dalam folder ini. Dalam fail GestureLock.vue, tambahkan kod berikut:

<template>
  <view class="container">
    <canvas 
      ref="gestureCanvas" 
      canvas-id="gestureCanvas"
      :style="{ width: '100%', height: '100%' }"
    ></canvas>
  </view>
</template>

<script>
export default {
  onLoad() {
    const query = uni.createSelectorQuery().in(this);
    query.select('.container')
      .boundingClientRect((res) => {
        const canvasWidth = res.width;
        const canvasHeight = res.height;
        this.canvasWidth = canvasWidth;
        this.canvasHeight = canvasHeight;
        this.ctx = uni.createCanvasContext('gestureCanvas');

        // 绘制初始画面
        this.drawBackground();
      })
      .exec();
  },
  methods: {
    // 绘制背景
    drawBackground() {
      this.ctx.setFillStyle('#F5F5F5');
      this.ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
      this.ctx.draw();
    },
  },
};
</script>

<style>
.container {
  width: 100vw;
  height: 100vh;
}
</style>

Dalam kod di atas, kami menambahkan elemen kanvas pada halaman dan menentukan nama rujukan elemen sebagai gestureCanvas melalui atribut ref. Dan id elemen kanvas ditentukan sebagai gestureCanvas melalui atribut canvas-id. Dalam kaedah onLoad komponen, kami menggunakan uni.createSelectorQuery().in(this) untuk mendapatkan lebar dan ketinggian elemen kanvas dan menyimpannya dalam data komponen. Dalam kaedah komponen, kami mentakrifkan kaedah lukisan latar belakang drawBackground(), yang digunakan untuk melukis latar belakang kelabu pada kanvas.

  1. Memantau operasi gerak isyarat

Seterusnya, kita perlu memantau operasi gerak isyarat pengguna, termasuk menekan jari, pergerakan dan pelepasan. Kita boleh mencapai fungsi ini melalui acara gerak isyarat uniapp. Dalam kaedah fail GestureLock.vue, tambahkan kod berikut:

methods: {
  // ...

  // 手指按下事件
  onTouchStart(event) {
    const touch = event.touches[0];
    const startX = touch.clientX;
    const startY = touch.clientY;
    // ...
  },

  // 手指移动事件
  onTouchMove(event) {
    const touch = event.touches[0];
    const moveX = touch.clientX;
    const moveY = touch.clientY;
    // ...
  },

  // 手指松开事件
  onTouchEnd() {
    // ...
  },
},

Dalam kod di atas, tiga kaedah ditambahkan pada kaedah, sepadan dengan acara tekan jari, acara gerakan jari dan acara pelepasan jari. Dalam acara tekan jari, kami memperoleh kedudukan jari semasa melalui event.touches[0] dan menyimpannya dalam pembolehubah startX dan startY untuk kegunaan seterusnya. Dalam acara pergerakan jari, kami memperoleh kedudukan jari semasa melalui event.touches[0] dan menyimpannya dalam pembolehubah moveX dan moveY untuk kegunaan seterusnya. Dalam acara pelepasan jari, kami boleh mengesahkan kata laluan gerak isyarat.

  1. Lukis laluan gerak isyarat

Seterusnya, kita perlu melukis laluan gerak isyarat pada kanvas. Dalam kaedah fail GestureLock.vue, tambahkan kod berikut:

methods: {
  // ...

  // 绘制手势路径
  drawGesturePath() {
    this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
    this.drawBackground();
    
    // ...

    this.ctx.setStrokeStyle('#337ab7');
    this.ctx.setLineWidth(3);
    this.ctx.setLineCap('round');
    this.ctx.setLineJoin('round');

    for (let i = 0; i < this.gesturePath.length - 1; i++) {
      const pointA = this.gesturePath[i];
      const pointB = this.gesturePath[i + 1];

      this.ctx.beginPath();
      this.ctx.moveTo(pointA.x, pointA.y);
      this.ctx.lineTo(pointB.x, pointB.y);
      this.ctx.stroke();
    }

    this.ctx.draw(true);
  },
},

Dalam kod di atas, dalam kaedah drawGesturePath, kami mula-mula menggunakan kaedah this.ctx.clearRect() untuk mengosongkan kandungan pada kanvas, dan kemudian panggil kaedah drawBackground untuk melukis latar belakang Kelabu. Seterusnya, kami menggunakan kaedah this.ctx.setStrokeStyle() untuk menetapkan warna garisan, gunakan kaedah this.ctx.setLineWidth() untuk menetapkan lebar garisan, gunakan kaedah this.ctx.setLineCap() untuk tetapkan gaya titik akhir baris, dan gunakan ini Kaedah ctx.setLineJoin() menetapkan gaya sambungan baris. Kemudian, dengan merentasi tatasusunan gesturePath, setiap segmen baris laluan gerak isyarat dilukis mengikut turutan. Akhir sekali, gunakan kaedah this.ctx.draw(true) untuk memaparkan kandungan yang dilukis pada kanvas dalam masa nyata.

  1. Pelaksanaan fungsi kata laluan gerak isyarat lengkap

Akhir sekali, kami menyepadukan kod sebelumnya untuk merealisasikan fungsi kata laluan gerak isyarat yang lengkap. Dalam fail GestureLock.vue, tambahkan kod berikut:

<template>
  <view class="container">
    <canvas 
      ref="gestureCanvas" 
      canvas-id="gestureCanvas"
      :style="{ width: '100%', height: '100%' }"
      @touchstart="onTouchStart"
      @touchmove="onTouchMove"
      @touchend="onTouchEnd"
    ></canvas>
  </view>
</template>

<script>
export default {
  data() {
    return {
      canvasWidth: 0,
      canvasHeight: 0,
      ctx: null,
      startX: 0,
      startY: 0,
      moveX: 0,
      moveY: 0,
      gesturePath: [], // 手势路径的点集合
    };
  },
  onLoad() {
    const query = uni.createSelectorQuery().in(this);
    query.select('.container')
      .boundingClientRect((res) => {
        const canvasWidth = res.width;
        const canvasHeight = res.height;
        this.canvasWidth = canvasWidth;
        this.canvasHeight = canvasHeight;
        this.ctx = uni.createCanvasContext('gestureCanvas');

        // 绘制初始画面
        this.drawBackground();
      })
      .exec();
  },
  methods: {
    // 绘制背景
    drawBackground() {
      this.ctx.setFillStyle('#F5F5F5');
      this.ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
      this.ctx.draw();
    },

    // 手指按下事件
    onTouchStart(event) {
      const touch = event.touches[0];
      this.startX = touch.clientX;
      this.startY = touch.clientY;
      this.gesturePath.push({ x: this.startX, y: this.startY });
    },

    // 手指移动事件
    onTouchMove(event) {
      const touch = event.touches[0];
      this.moveX = touch.clientX;
      this.moveY = touch.clientY;
      this.gesturePath.push({ x: this.moveX, y: this.moveY });
      this.drawGesturePath();
    },

    // 手指松开事件
    onTouchEnd() {
      // 进行手势密码的验证
      console.log(this.gesturePath);
    },

    // 绘制手势路径
    drawGesturePath() {
      this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
      this.drawBackground();

      this.ctx.setStrokeStyle('#337ab7');
      this.ctx.setLineWidth(3);
      this.ctx.setLineCap('round');
      this.ctx.setLineJoin('round');

      for (let i = 0; i < this.gesturePath.length - 1; i++) {
        const pointA = this.gesturePath[i];
        const pointB = this.gesturePath[i + 1];

        this.ctx.beginPath();
        this.ctx.moveTo(pointA.x, pointA.y);
        this.ctx.lineTo(pointB.x, pointB.y);
        this.ctx.stroke();
      }

      this.ctx.draw(true);
    },
  },
};
</script>

<style>
.container {
  width: 100vw;
  height: 100vh;
}
</style>

Dalam kod di atas, kami menambah tiga pendengar acara gerak isyarat pada elemen kanvas: @touchstart, @touchmove dan @touchend. Dalam kaedah pemprosesan acara yang sepadan, kami melakukan operasi berkaitan, termasuk mendapatkan dan menyimpan kedudukan jari, lukisan dan pengemaskinian masa nyata laluan gerak isyarat, dsb. Dalam acara pelepasan jari, kami boleh mengesahkan kata laluan gerak isyarat, seperti menentukan sama ada laluan gerak isyarat yang dilukis oleh pengguna memenuhi keperluan atau konsisten dengan kata laluan gerak isyarat pratetap.

Melalui langkah di atas, kami boleh melaksanakan fungsi kata laluan gerak isyarat dalam uniapp. Apabila pengguna menekan jarinya dan menggerakkannya, laluan gerak isyarat akan dipaparkan pada kanvas dalam masa nyata apabila pengguna melepaskan jarinya, kami boleh melakukan operasi pengesahan yang sepadan berdasarkan laluan gerak isyarat. Saya harap artikel ini akan membantu anda melaksanakan fungsi kata laluan gerak isyarat dalam uniapp Jika anda mempunyai sebarang soalan, sila tinggalkan mesej untuk perbincangan.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi kata laluan gerak isyarat dalam uniapp. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn