uniapp重力感应
获取设备方向信息
在UniApp中,可以通过uni.onDeviceMotionChange监听设备方向变化。该API返回的beta、gamma和alpha参数分别对应设备的俯仰角、左右倾斜角和旋转角。
uni.onDeviceMotionChange(function(res) {
console.log('beta:', res.beta); // 前后倾斜角度
console.log('gamma:', res.gamma); // 左右倾斜角度
console.log('alpha:', res.alpha); // 绕Z轴旋转角度
});
处理重力加速度数据
uni.onAccelerometerChange可用于获取设备的加速度数据。返回的x、y和z参数分别表示三个方向上的加速度。

uni.startAccelerometer({
interval: 'game'
});
uni.onAccelerometerChange(function(res) {
console.log('x轴加速度:', res.x);
console.log('y轴加速度:', res.y);
console.log('z轴加速度:', res.z);
});
兼容性处理
不同平台对重力感应API的支持程度不同。iOS通常需要用户授权,Android部分机型可能不支持。可以通过uni.getSystemInfo检查设备能力。
uni.getSystemInfo({
success: function(res) {
console.log('重力感应支持:', res.gyroscopeSupported);
}
});
性能优化建议
频繁的重力感应监听会消耗较多资源。在不需要时应及时停止监听,特别是在页面卸载时。

// 停止监听
uni.stopAccelerometer();
uni.offDeviceMotionChange();
实际应用示例
结合重力感应开发游戏时,可以将加速度数据转换为屏幕元素的位置变化。以下是一个简单的示例:
let ballPosition = {x: 150, y: 150};
uni.onAccelerometerChange(function(res) {
ballPosition.x += res.x * 10;
ballPosition.y -= res.y * 10;
// 边界检查
ballPosition.x = Math.max(0, Math.min(300, ballPosition.x));
ballPosition.y = Math.max(0, Math.min(300, ballPosition.y));
// 更新UI
this.setData({
ballPosition: ballPosition
});
});
注意事项
使用重力感应功能时需要注意以下几点:
- 部分Android设备可能返回的加速度值范围与iOS不同
- 在微信小程序中,需要用户主动授权才能使用运动传感器
- 模拟器上可能无法正常测试重力感应功能
- 某些设备在低电量模式下会限制传感器使用
