uni-app App端需调用uni.startAccelerometer后,用uni.onAccelerometerChange监听加速度模长突变(如currAcc>2.0且增量>1.8g),配合isShaking防抖与1500ms锁定期实现稳定摇一摇,禁用uni.onDeviceMotionChange因其响应线性晃动弱。

uni-app App端怎么用uni.onAccelerometerChange监听摇一摇
App端摇一摇本质是检测加速度突变,uni-app 提供了 uni.onAccelerometerChange,但直接监听原始数据容易误触发、漏触发——关键不在“有没有”,而在“怎么滤波和判定”。
- 必须调用
uni.startAccelerometer才能开始接收数据,否则监听器注册了也收不到回调 - Android 和 iOS 对采样频率支持不同:
interval参数设为"game"(最快)在 iOS 上可能被降频,实际建议用"ui"平衡灵敏度与耗电 - 摇一摇不是看单次数值大小,而是看连续几个采样点的矢量模长变化率;推荐计算
Math.sqrt(x*x + y*y + z*z)得到合加速度,再对比前后差值 - 示例逻辑:记录上一时刻的合加速度
lastAcc,当前为currAcc,若currAcc - lastAcc > 1.8(单位:g)且currAcc > 2.0,才视为一次有效“起始抖动”
为什么uni.onDeviceMotionChange不适合做摇一摇
uni.onDeviceMotionChange 返回的是姿态角(alpha/beta/gamma),反映设备朝向变化,对快速小幅旋转敏感,但对沿任意轴的线性晃动(比如手掌带动手机前后甩)响应弱——而真实摇一摇动作主要是线性加速度突变。
- 实测中,用户握着手机左右快速摆手,
onDeviceMotionChange可能只触发 1–2 次,而onAccelerometerChange能稳定捕获 5+ 个峰值 - 微信、QQ 等原生 App 全部基于加速度计实现摇一摇,非陀螺仪或磁场数据
- 如果你在真机调试时发现完全没回调,请先检查是否调用了
uni.startAccelerometer,以及 manifest.json 中 Android 的ACCESS_BACKGROUND_LOCATION权限是否误开(它不相关,但会干扰传感器初始化)
防抖与连续触发控制:别让用户摇一下弹出三次
原始加速度数据噪声大,一次真实摇动常触发多个符合条件的峰值,必须加时间窗口和状态锁。
- 检测到一次有效抖动后,立即设置标志位
isShaking = true,并启动setTimeout在 1500ms 后重置 - 在
isShaking为true期间,所有新触发都忽略 - 不要依赖
clearTimeout去取消旧定时器——摇动持续时长不可控,固定窗口比动态重置更稳 - 示例节选:
let isShaking = false;<br>uni.onAccelerometerChange(res => {<br> const acc = Math.sqrt(res.x**2 + res.y**2 + res.z**2);<br> if (!isShaking && acc > 2.0 && acc - lastAcc > 1.8) {<br> isShaking = true;<br> setTimeout(() => isShaking = false, 1500);<br> uni.showToast({ title: '摇到了', icon: 'none' });<br> }<br> lastAcc = acc;<br>});
App真机调试时onAccelerometerChange无响应的常见原因
模拟器永远返回假数据,必须真机测试;但即使真机,也有几个硬性条件卡住。
- iOS 需在
manifest.json → App SDK 配置 → iOS 设置中勾选「加速度计」,否则 API 直接静默失效 - Android 9+ 要求 targetSdkVersion ≥ 29 时,默认禁止后台传感器访问,确保
uni-app的AndroidManifest.xml中没有禁用android.permission.ACTIVITY_RECOGNITION(HBuilderX 3.7+ 已默认添加) - 某些定制 ROM(如华为 EMUI、小米 MIUI)会限制后台传感器,需手动在系统设置里给 App 开启「运动传感器」权限,位置通常在「应用管理 → 权限管理 → 运动与健康」
- 调用
uni.startAccelerometer后,务必检查回调里的err字段,失败时err.errMsg可能是"startAccelerometer:fail not support"(说明权限或配置未生效)
实际写的时候最容易卡在权限配置和防抖时机上,尤其是 iOS 打包前漏勾那个开关,或者 Android 上没手动开系统级运动权限——这些地方不报错,但就是不动。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











