尼玛,百度一堆出来不靠谱的,还是这个个们靠谱。
这是不靠谱的:https://blog.csdn.net/u010302327/article/details/78930966
这也是不靠谱的:https://blog.csdn.net/zhrjyl/article/details/77621936
这个靠谱:https://blog.csdn.net/u014702999/article/details/51483361
就是说,安卓获取手机倾斜角度,用加速度计和磁力计去判断,不是用陀螺仪判断(错了请拍砖)。iOS的不知道,可留言。
之前我们认为使用陀螺仪来去判断倾斜角度,但是,陀螺仪是积分,有累计误差的,所以一般都是陀螺仪和加速度配合计算角度。
google直接用加速度计和磁力计来做,也是可以的。
同时注意values[3]对应的坐标方向,正常是这样的:

然后API是这样说的:

所以,用了getRotationMatrix()函数进行计算后,他们的对应关系就变了:value[0]=z,value[1]=x,value[2]=y.
最后贴出代码:
package com.example.sensordemo;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends Activity {
private SensorManager mSensorManager;
private Sensor accelerometer; // 加速度传感器
private Sensor magnetic; // 地磁场传感器
private TextView azimuthAngle;
private float[] accelerometerValues = new float[3];
private float[] magneticFieldValues = new float[3];
private static final String TAG = "---MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 实例化传感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 初始化加速度传感器
accelerometer = mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 初始化地磁场传感器
magnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
azimuthAngle = (TextView) findViewById(R.id.azimuth_angle_value);
calculateOrientation();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
// 注册监听
mSensorManager.registerListener(new MySensorEventListener(),
accelerometer, Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(new MySensorEventListener(), magnetic,
Sensor.TYPE_MAGNETIC_FIELD);
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
// 解除注册
mSensorManager.unregisterListener(new MySensorEventListener());
super.onPause();
}
// 计算方向
private void calculateOrientation() {
float[] values = new float[3];
float[] R = new float[9];
SensorManager.getRotationMatrix(R, null, accelerometerValues,
magneticFieldValues);
SensorManager.getOrientation(R, values);
values[0] = (float) Math.toDegrees(values[0]);
Log.i(TAG, values[0] + "");
if (values[0] >= -5 && values[0] < 5) {
azimuthAngle.setText("正北");
} else if (values[0] >= 5 && values[0] < 85) {
// Log.i(TAG, "东北");
azimuthAngle.setText("东北");
} else if (values[0] >= 85 && values[0] <= 95) {
// Log.i(TAG, "正东");
azimuthAngle.setText("正东");
} else if (values[0] >= 95 && values[0] < 175) {
// Log.i(TAG, "东南");
azimuthAngle.setText("东南");
} else if ((values[0] >= 175 && values[0] <= 180)
|| (values[0]) >= -180 && values[0] < -175) {
// Log.i(TAG, "正南");
azimuthAngle.setText("正南");
} else if (values[0] >= -175 && values[0] < -95) {
// Log.i(TAG, "西南");
azimuthAngle.setText("西南");
} else if (values[0] >= -95 && values[0] < -85) {
// Log.i(TAG, "正西");
azimuthAngle.setText("正西");
} else if (values[0] >= -85 && values[0] < -5) {
// Log.i(TAG, "西北");
azimuthAngle.setText("西北");
}
}
class MySensorEventListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values;
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticFieldValues = event.values;
}
calculateOrientation();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
}嗯,这样就可以检测手机的倾斜角度了。