uni-app仪表拨盘输入数据的组建

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app仪表拨盘输入数据的组建

1 回复

在uni-app中创建一个仪表拨盘输入数据的组件,可以通过使用canvas绘制表盘,并结合触摸事件实现数据的输入。以下是一个简单的示例代码,展示了如何实现这个功能。

首先,创建一个新的组件DialInput.vue

<template>
  <view class="container">
    <canvas canvas-id="dialCanvas" style="width: 300px; height: 300px;"></canvas>
    <view class="value">{{ value }}</view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      value: 0, // 当前值
      centerX: 150, // 画布中心X坐标
      centerY: 150, // 画布中心Y坐标
      radius: 120, // 表盘半径
      startAngle: -Math.PI / 2, // 起始角度
    };
  },
  mounted() {
    this.drawDial();
    this.$refs.dialCanvas.addEventListener('touchstart', this.onTouchStart);
    this.$refs.dialCanvas.addEventListener('touchmove', this.onTouchMove);
  },
  methods: {
    drawDial() {
      const ctx = uni.createCanvasContext('dialCanvas');
      // 绘制表盘背景
      ctx.beginPath();
      ctx.arc(this.centerX, this.centerY, this.radius, 0, 2 * Math.PI);
      ctx.setFillStyle('#e0e0e0');
      ctx.fill();
      // 绘制指针
      const angle = this.startAngle + (this.value / 100) * 2 * Math.PI;
      ctx.beginPath();
      ctx.moveTo(this.centerX, this.centerY);
      ctx.lineTo(this.centerX + this.radius * 0.8 * Math.cos(angle), this.centerY - this.radius * 0.8 * Math.sin(angle));
      ctx.setStrokeStyle('#333');
      ctx.setLineWidth(6);
      ctx.stroke();
      ctx.draw();
    },
    onTouchStart(e) {
      this.startX = e.touches[0].x;
      this.startY = e.touches[0].y;
    },
    onTouchMove(e) {
      const deltaX = e.touches[0].x - this.startX;
      const deltaY = e.touches[0].y - this.startY;
      const angle = Math.atan2(deltaY, deltaX) - this.startAngle;
      this.value = Math.min(100, Math.max(0, (angle / (2 * Math.PI)) * 100));
      this.drawDial();
      this.startX = e.touches[0].x;
      this.startY = e.touches[0].y;
    },
  },
};
</script>

<style scoped>
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.value {
  margin-top: 20px;
  font-size: 24px;
}
</style>

这个组件包含了一个canvas用于绘制表盘和指针,以及一个显示当前值的view。通过监听canvas的触摸事件,可以计算出触摸位置相对于表盘中心的角度,从而更新当前值并重新绘制表盘。

注意:在实际项目中,可能需要对触摸事件的处理进行更多的优化,比如防抖处理、限制指针移动范围等。此外,样式部分也可以根据实际需求进行调整。

回到顶部