Android獲取三軸方向基礎知識
阿新 • • 發佈:2019-01-22
參考:《Android 4》高階程式設計(第三版)第12章
基礎知識
繞Z軸旋轉角度:Azimuth,我稱之為正北轉角(指南針的磁北方向)
繞X軸旋轉角度:Pitch,我稱之為頂尾翹角
繞Y軸旋轉角度:Roll,我稱之為左右轉角
方案一:磁場感測器+加速度感測器(推薦)
第一步:獲取感測器系統服務
private SensorManager sensorManager; 初始化 protected void onCreate(Bundle savedInstanceState) { sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); }
第二步:初始化加速度的三軸變數和磁場感測器的三軸變數
private float[] accelerometerValues;
private float[] magnetFieldValues;
第三步:重寫監聽器
private final SensorEventListener sensorEventListener = new SensorEventListener() { @SuppressWarnings("deprecation") @Override public void onSensorChanged(SensorEvent event) { // TODO 自動生成的方法存根 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { accelerometerValues = event.values; } if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { magnetFieldValues = event.values; } }
第四步:註冊相應的感測器到相應的監聽器
<pre name="code" class="java">@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 獲取系統的感測器服務 */ sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); getSensorService(); }
private void getSensorService() {
// int rate=SensorManager.SENSOR_DELAY_FASTEST;
int rate=SensorManager.SENSOR_DELAY_NORMAL;
Sensor accelerometerSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(sensorEventListener,
accelerometerSensor, rate);
Sensor magnetSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sensorManager.registerListener(sensorEventListener, magnetSensor,
rate);
}
第五步:獲取當前方向(定時200ms獲取方向)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 獲取系統的感測器服務 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
Timer updateTimer = new Timer("gForceUpdate");
updateTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO 自動生成的方法存根
if (accelerometerValues != null &&magnetFieldValues != null) {
float[] values = new float[3];
float[] R = new float[9];
SensorManager.getRotationMatrix(R, null,
accelerometerValues, magnetFieldValues);
SensorManager.getOrientation(R, values);
values[0] = (float) Math.toDegrees(values[0]);// 正北轉角
values[1] = (float) Math.toDegrees(values[1]);// 頂尾翹角
values[2] = (float) Math.toDegrees(values[2]);// 左右轉角
/* 將三軸方向插入到資料庫中 */
}
}
}, 0, 200);
}
方案二:使用廢棄的虛擬方向感測器
第一步:獲取感測器系統服務
private SensorManager sensorManager;
初始化
protected void onCreate(Bundle savedInstanceState) {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
第二步:初始化方向變數
private float x_orientation = -999;
private float y_orientation = -999;
private float z_orientation = -999;
第三步:重寫監聽器
private final SensorEventListener sensorEventListener = new SensorEventListener() {
@SuppressWarnings("deprecation")
@Override
public void onSensorChanged(SensorEvent event) {
// TODO 自動生成的方法存根
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
orientationValues = event.values;
z_orientation = event.values[0]; // 正北轉角
x_orientation = event.values[1]; // 頂尾翹角
y_orientation = event.values[2]; // 左右轉角
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO 自動生成的方法存根
}
};
第四步:註冊相應的感測器
<pre name="code" class="java">@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 獲取系統的感測器服務 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
}
private void getSensorService() {
// int rate=SensorManager.SENSOR_DELAY_FASTEST;
int rate=SensorManager.SENSOR_DELAY_NORMAL;
@SuppressWarnings("deprecation")
Sensor orientationSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sensorManager.registerListener(sensorEventListener,orientationSensor,
rate);
}
第五步:獲取當前方向——定時200ms獲取方向
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 獲取系統的感測器服務 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
Timer updateTimer = new Timer("gForceUpdate");
updateTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO 自動生成的方法存根
if (x_orientation!=-999&& y_orientation!=-999&& z_orientation!=-999) {
/* 將三軸方向插入到資料庫中 */
}
}
}, 0, 200);
}
注意:需要在onResume()中註冊感測器,在onDestroy()、onDestroy()和onPause()中登出感測器監聽
@Override
protected void onResume() {
// TODO 自動生成的方法存根
super.onResume();
getSensorService();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
sensorManager.unregisterListener(sensorEventListener);
}
@Override
protected void onPause() {
// TODO 自動生成的方法存根
super.onPause();
sensorManager.unregisterListener(sensorEventListener);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
sensorManager.unregisterListener(sensorEventListener);
}