Android 如何准确获取手机的倾斜角度?
Android 实现平放0°、竖直90°倾斜角度获取方案
完全可以通过手机内置传感器实现该需求,你要的倾斜角度对应Android传感器体系中的俯仰角(pitch),刚好符合你定义的数值规则:屏幕朝上平放时为0°,屏幕朝向用户竖直放置时为90°。
实现步骤
1. 初始化传感器
优先使用旋转矢量传感器,相比单独使用加速度+地磁传感器的组合,数值更稳定,抗干扰能力更强:
// 初始化传感器管理器 SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor rotationVectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
传感器属于系统普通权限,不需要动态申请,直接使用即可。
2. 注册传感器回调计算角度
SensorEventListener tiltListener = new SensorEventListener() { private final float[] rotationMatrix = new float[9]; private final float[] orientationValues = new float[3]; @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != Sensor.TYPE_ROTATION_VECTOR) return; // 旋转矢量转为旋转矩阵 SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values); // 旋转矩阵转为方位角数组,依次为azimuth、pitch、roll SensorManager.getOrientation(rotationMatrix, orientationValues); // 弧度转角度,得到俯仰角 float pitchAngle = (float) Math.toDegrees(orientationValues[1]); // 处理负数,保证数值在0~90区间符合需求 pitchAngle = Math.abs(pitchAngle); // 此处直接使用pitchAngle即可,就是你要的倾斜角度 } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // 无特殊需求可留空 } }; // 注册监听器,使用普通采样率平衡功耗和灵敏度 sensorManager.registerListener(tiltListener, rotationVectorSensor, SensorManager.SENSOR_DELAY_NORMAL);
3. 页面销毁时注销监听器
避免后台持续占用传感器导致耗电:
@Override protected void onDestroy() { super.onDestroy(); sensorManager.unregisterListener(tiltListener); }
注意事项
- 若需要兼容不支持旋转矢量传感器的低端设备,可以替换为
TYPE_ACCELEROMETER+TYPE_MAGNETIC_FIELD组合,分别获取两个传感器的数值后调用SensorManager.getRotationMatrix()生成旋转矩阵,后续逻辑和上方一致 - 如果觉得数值抖动明显,可以对连续返回的pitchAngle做低通滤波处理,平滑数值
- 不要在
onSensorChanged回调中执行耗时操作,传感器回调频率很高,容易造成卡顿
内容的提问来源于stack exchange,提问作者Henry Zhu
相关产品推荐
相关产品推荐

