我正在使用getRotationMatrix()来计算v [0],v [1],v [2]以及onSensorChanged()方法中相应的方位角,俯仰和滚转值。我想知道当boolean detectAzimuth变为true时,如何只将第一个v [0](或相应的方位角)值保存到firstAzimuth中?
private boolean detectAzimuth = false;
private float firstAzimuth;
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accValues = event.values.clone();
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
geoValues = event.values.clone();
}
boolean success = SensorManager.getRotationMatrix(r, i, accValues,
geoValues);
if (success) {
SensorManager.getOrientation(r, v);
if (detectAzimuth) {
azimuth = v[0] * (180 / Math.PI);
}
pitch = v[1] * (180 / Math.PI);
roll = v[2] * (180 / Math.PI);
}
}
答案 0 :(得分:0)
您可以首次检查是否获得了方位角的值。如果没有,请获取值并使detectAzimuth为true。然后将值保存在SharedPreference中。
现在,下次使用布尔变量detectAzimuth
检查您是否已经第一次使用了方位角的值。如果它的真实意味着你已经接受了它。从Sharedpreference获取它并将其分配给firstAzimuth
。那就是你总是会得到azimuth
的第一个值。
if (success) {
SensorManager.getOrientation(r, v);
if (!detectAzimuth) { // if not taken yet
azimuth = v[0] * (180 / Math.PI); // take the value
detectAzimuth = true; //make the bolean true to know that you've taken the value
//Store in SharedPreference
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
editor.putFloat("firstAzimuth", azimuth);
editor.commit();
}else{ //if already taken value first time
//get the first value from SharedPreference and assign it to firstAzimuth
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
firstAzimuth = prefs.getFloat("firstAzimuth", 0.0);
//take the new value
azimuth = v[0] * (180 / Math.PI); // take the new value but don't store it
}
pitch = v[1] * (180 / Math.PI);
roll = v[2] * (180 / Math.PI);
}
}
希望这会有所帮助。仅为了您的信息,这将阻止您获取更多azimuth
值,因为您已经收到一个值并且每次都检查它是否存在。我不确定你是否想要那个。如果没有,那么我们可以进一步讨论可能性。