【HarmonyOS】摇一摇功能

43 阅读2分钟

摇一摇实现方案

使用@ohos.sensor实现摇一摇功能。sensor模块订阅相关传感器并获取传感器的属性

实现思路

获取设备移动状态

订阅传感器的加速度,获取设备移动时x、y、z三个方向的加速度,定义用于判断是否有效晃动的阈值加速度criticalSpeed,当 x2+y2+z2>criticalSpeed2x^2+y^2+z^2 > criticalSpeed^2时此次晃动属于有效晃动。

移动频率用于判断是否快速摇动

第一次有效晃动时记录时间戳,定义有效晃动次数,当达到有效晃动次数时时间戳减去第一次记录的时间戳在规定时间内,摇一摇完成触发相关方法。

相关代码


import { sensor } from '@kit.SensorServiceKit';
import { promptAction } from '@kit.ArkUI';

class WaggleHandle {
  // 加速度阈值,当设备加速度总和超过此阈值时视为有效摇动
  private readonly criticalSpeed = 20;
  // 加速度传感器监听间隔
  private readonly shakeIntervalThreshold = 200;
  // 连续有效摇动次数计数
  private shakeCount: number = 0;
  // 需要连续的有效摇动次数才能触发事件
  private maxShakeCount: number = 3;
  // 第一次有效摇动时间戳
  private firstTime: number = 0
  // 最短间隔时间
  private shakeTime: number = 600

  shakeStatus(accelerometerData: sensor.AccelerometerResponse) {

    const currentTime = Date.now()

    // 计算设备加速度总和的平方
    const totalAcceleration = Math.pow(accelerometerData.x, 2) + Math.pow(accelerometerData.y, 2) + Math.pow(accelerometerData.z, 2);

    if (totalAcceleration > Math.pow(this.criticalSpeed,2)) {
      // 记录第一次有效摇动时间
      this.firstTime ||= currentTime

      if (this.shakeTime >= currentTime - this.firstTime) {
        this.shakeCount++
        // 摇一摇成功重置次数和第一次有效摇动时间
        if (this.shakeCount === this.maxShakeCount) {
          this.shakeCount = 0
          this.firstTime = 0
          return true
        }
        return false
      } else {
        // 超出规定间隔时间,重置次数和第一次有效摇动时间
        this.shakeCount = 0
        this.firstTime = 0
        return false
      }
    } else {
      return false
    }

  }

  init() {
    try {
      // 监听加速度传感器
      sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) => {
        if (this.shakeStatus(data)) {
          promptAction.showToast({ message: '用户进行了摇一摇操作' });
        }
      }, { interval: this.shakeIntervalThreshold * 1000000 /* 默认值为200000000ns。将间隔调整为毫秒级别 */ });
    } catch (error) {
      console.info(JSON.stringify(error));
    }
  }
}