一、前言

"摇一摇"几乎是所有移动平台都会使用到的交互方式,例如:

  • 微信摇一摇
  • QQ摇一摇
  • 支付宝集五福
  • 抽奖活动
  • 游戏体感控制
  • 音乐切歌
  • 运动检测

HarmonyOS NEXT同样提供了完整的Sensor传感器能力,因此实现起来并不复杂。

整个实现流程如下:


手机发生晃动
        │
        ▼
Accelerometer采集XYZ加速度
        │
        ▼
计算加速度变化值
        │
        ▼
超过设定阈值
        │
        ▼
判定Shake
        │
        ▼
执行业务逻辑

二、摇一摇原理

手机内部具有MEMS加速度传感器。

它会实时返回:


X轴
Y轴
Z轴

例如:


{
    x: 0.2,
    y: 1.1,
    z: 9.6
}

其中:


Z≈9.8

表示静止状态

当手机快速摇动:


x

0.2
↓

8.5

↓

-9.2

↓

7.8

数据会剧烈变化。

因此:

检测XYZ变化速度即可判断摇一摇。


三、HarmonyOS传感器介绍

HarmonyOS NEXT Sensor主要包括:

类型 作用
Accelerometer 加速度
Gyroscope 陀螺仪
Gravity 重力
Magnetic 磁力
Rotation Vector 姿态
Ambient Light 光照
Proximity 距离

摇一摇主要使用:


Accelerometer

四、导入Sensor模块


import sensor from '@ohos.sensor'

即可开始监听。


五、监听加速度

启动监听:


sensor.on(
    sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER,
    (data)=>{
        console.info(JSON.stringify(data))
    }
)

输出:


{
    x:0.13,
    y:-0.65,
    z:9.72
}

每秒几十次数据。


六、停止监听

页面退出:


sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER)

一定要注销。

否则:

  • 持续耗电
  • 后台运行
  • 内存泄漏

七、数据结构

Accelerometer返回:


interface AccelerometerResponse{

    x:number

    y:number

    z:number

}

单位:


m/s²

八、第一种实现方式(简单版)

直接计算:


|x|

+

|y|

+

|z|

例如:


let speed=Math.abs(x)+Math.abs(y)+Math.abs(z)

若:


speed>20

认为:


Shake

虽然简单:

缺点:

  • 容易误判
  • 灵敏度差

九、推荐算法(速度算法)

定义:


lastX=0

lastY=0

lastZ=0

每次:


dx=x-lastX

dy=y-lastY

dz=z-lastZ

计算:


speed=Math.sqrt(
dx*dx+
dy*dy+
dz*dz
)

速度越大:

说明摇动越剧烈。


十、完整算法


let dx=x-lastX
let dy=y-lastY
let dz=z-lastZ

let speed=Math.sqrt(
dx*dx+
dy*dy+
dz*dz
)

if(speed>15){

    shake()

}

lastX=x
lastY=y
lastZ=z

实际效果已经很好。


十一、防抖处理

否则:


摇一下

触发

20次

加入时间限制:


let lastTime=0

判断:


let now=Date.now()

if(now-lastTime<1000){

    return

}

lastTime=now

即可:


1秒最多触发一次

十二、完整工具类


import sensor from '@ohos.sensor'

export class ShakeDetector {

  private lastX: number = 0
  private lastY: number = 0
  private lastZ: number = 0

  private lastTriggerTime: number = 0

  private threshold: number = 15

  start(callback: () => void) {

    sensor.on(
      sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER,
      (data) => {

        let dx = data.x - this.lastX
        let dy = data.y - this.lastY
        let dz = data.z - this.lastZ

        let speed = Math.sqrt(
          dx * dx +
          dy * dy +
          dz * dz
        )

        let now = Date.now()

        if (
          speed > this.threshold &&
          now - this.lastTriggerTime > 1000
        ) {

          this.lastTriggerTime = now

          callback()
        }

        this.lastX = data.x
        this.lastY = data.y
        this.lastZ = data.z

      }
    )

  }

  stop() {

    sensor.off(
      sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER
    )

  }

}

十三、页面使用


private detector=new ShakeDetector()

页面出现:


aboutToAppear(){

    this.detector.start(()=>{

        console.info("Shake")

    })

}

页面退出:


aboutToDisappear(){

    this.detector.stop()

}

十四、弹出提示

例如:


this.detector.start(()=>{

    promptAction.showToast({

        message:"摇一摇成功"

    })

})

即可实现:


📳

摇一摇成功

十五、播放音效


player.play()

或者:


震动+

声音+

动画

体验更好。


十六、触发动画

例如:


animateTo({

    duration:300

},()=>{

    this.rotate=15

})

然后恢复:


this.rotate=0

形成:


左右摆动

十七、调整灵敏度

建议:

场景 Threshold
极灵敏 8
普通 12
推荐 15
较稳 18
激烈 22

十八、采样频率优化

通常无需最高频率。

可以选择适中的采样率,以平衡实时性与功耗:


// 根据HarmonyOS Sensor API支持的参数设置采样间隔
// 示例:使用适中的采样率

建议:

场景 建议采样频率
UI交互 20~50Hz
游戏 50~100Hz
精准检测 100Hz以上(视设备支持情况)

采样频率越高:


CPU↑

耗电↑

十九、避免误触发

推荐组合策略:


速度>Threshold
        &&
时间>1000ms
        &&
连续变化次数≥2

这样误判率会明显降低。


二十、实战案例

抽奖


摇一摇

↓

开始抽奖

↓

播放动画

↓

请求接口

↓

中奖结果

游戏


摇手机

↓

角色释放技能

音乐播放器


摇手机

↓

下一首

聊天软件


摇一摇

↓

随机匹配好友

支付活动


摇一摇

↓

领取优惠券

二十一、生命周期管理

建议仅在页面可见时开启监听:


aboutToAppear() {
  this.detector.start(() => {
    // TODO: 摇一摇业务
  })
}

aboutToDisappear() {
  this.detector.stop()
}

不要长期保持监听,否则会增加设备功耗。


二十二、常见问题

1. 为什么监听不到数据?

可能原因:

  • 当前设备不支持加速度传感器。
  • 未正确注册监听。
  • 真机测试(部分模拟器不支持传感器)。

2. 为什么会一直触发?

通常是:

  • 阈值设置过低。
  • 未做时间防抖。
  • 未过滤轻微抖动。

建议提高阈值,并增加最小触发间隔。


3. 为什么摇得很用力却没有反应?

可能是:

  • 阈值设置过高。
  • 采样频率过低导致遗漏峰值。

可根据实际设备调节参数。


二十三、最佳实践

  • 将摇一摇逻辑封装为独立 ShakeDetector 类,便于复用。
  • 在页面进入时开启监听,离开时及时注销。
  • 使用速度变化而不是单次加速度值判断摇动。
  • 配合时间防抖,避免连续触发。
  • 根据业务场景动态调整阈值与采样频率。
  • 可结合震动、音效和动画提升交互体验。
  • 在低电量或后台状态下避免持续监听,减少资源消耗。

总结

HarmonyOS NEXT 实现手机摇一摇的核心思路可以归纳为四个步骤:

  1. 使用 Accelerometer(加速度传感器) 实时获取 X、Y、Z 三轴数据。
  2. 根据相邻两次采样计算加速度变化速度(Speed)。
  3. 当速度超过预设阈值,并满足防抖时间限制时,判定为一次有效的“摇一摇”。
  4. 执行对应业务逻辑(抽奖、切歌、动画、游戏交互等)。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐