如何使用 sensor/s 获取 phone 的 angle/degree?
How do I get the angle/degree of the phone with sensor/s?
我正在尝试使用 TYPE_ACCELEROMETER 传感器获得 phone 角度。
我的目标是仅在 phone 倾斜后获取角度值。
它有效,但问题是
当我把 phone 正面朝上放在 table 上时,
它仍然说 isLandscape = true;
private boolean isLandscape;
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER),1000000);
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent mSensorEvent) {
float X_Axis = mSensorEvent.values[0];
float Y_Axis = mSensorEvent.values[1];
double angle = Math.atan2(X_Axis, Y_Axis)/(Math.PI/180);
if(!isLandscape) {
if(angle > 80) {
Orientation = 90;
isLandscape = true;
}
}
else
{
if(Math.abs(angle) < 10) {
Orientation = 0; //portrait
isLandscape = false;
}
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
仅在 phone 倾斜后获得 phone 角度的最佳方法是什么?
很抱歉英语不好,
谢谢。
我不知道我是否理解你的问题,但我认为你希望你的应用程序仅在 phone 为纵向时才计算倾斜角度,首先你需要取 mSensorEvent.values[0]
并且在这种情况下如果 phone 处于站立状态将 return 0
,向右倾斜将是从 1 到 9 的负值,而向左倾斜是正值。
然后你必须做所有这些只是为了防止 mSensorEvent.values[1]
值在 9 和 7 之间,例如(9 是完美的标准)。确保设备处于纵向位置。
如果您需要角度值,可以将 mSensorEvent.values
的浮点值乘以 10。
希望对你有帮助
更新***
你可以试试这个:
private boolean isLandscape;
@Override
public void onSensorChanged(SensorEvent mSensorEvent) {
float X_Axis = mSensorEvent.values[0];
float Y_Axis = mSensorEvent.values[1];
if((X_Axis <= 6 && X_Axis >= -6) && Y_Axis > 5){
isLandscape = false;
}
else if(X_Axis >= 6 || X_Axis <= -6){
isLandscape = true;
}
}
无需注册 ACCELEROMETER
传感器,只需拥有类型 OrientationEventListener
的 class 成员。当设备平坦时,您应该得到 OrientationEventListener.ORIENTATION_UNKNOWN
.
请参阅 Android landscape right to landscape left event 了解如何创建 OrientationEventListener
class 成员。
或者您可以保留代码不变,但还要检查设备倾斜度。如果设备是扁平的,则将 isLandscape
标志设置为适合您情况的任何值。有关如何计算设备倾角,请参阅 How to measure the tilt of the phone in XY plane using accelerometer in Android
我正在尝试使用 TYPE_ACCELEROMETER 传感器获得 phone 角度。 我的目标是仅在 phone 倾斜后获取角度值。 它有效,但问题是 当我把 phone 正面朝上放在 table 上时, 它仍然说 isLandscape = true;
private boolean isLandscape;
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER),1000000);
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent mSensorEvent) {
float X_Axis = mSensorEvent.values[0];
float Y_Axis = mSensorEvent.values[1];
double angle = Math.atan2(X_Axis, Y_Axis)/(Math.PI/180);
if(!isLandscape) {
if(angle > 80) {
Orientation = 90;
isLandscape = true;
}
}
else
{
if(Math.abs(angle) < 10) {
Orientation = 0; //portrait
isLandscape = false;
}
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
仅在 phone 倾斜后获得 phone 角度的最佳方法是什么? 很抱歉英语不好,
谢谢。
我不知道我是否理解你的问题,但我认为你希望你的应用程序仅在 phone 为纵向时才计算倾斜角度,首先你需要取 mSensorEvent.values[0]
并且在这种情况下如果 phone 处于站立状态将 return 0
,向右倾斜将是从 1 到 9 的负值,而向左倾斜是正值。
然后你必须做所有这些只是为了防止 mSensorEvent.values[1]
值在 9 和 7 之间,例如(9 是完美的标准)。确保设备处于纵向位置。
如果您需要角度值,可以将 mSensorEvent.values
的浮点值乘以 10。
希望对你有帮助
更新***
你可以试试这个:
private boolean isLandscape;
@Override
public void onSensorChanged(SensorEvent mSensorEvent) {
float X_Axis = mSensorEvent.values[0];
float Y_Axis = mSensorEvent.values[1];
if((X_Axis <= 6 && X_Axis >= -6) && Y_Axis > 5){
isLandscape = false;
}
else if(X_Axis >= 6 || X_Axis <= -6){
isLandscape = true;
}
}
无需注册 ACCELEROMETER
传感器,只需拥有类型 OrientationEventListener
的 class 成员。当设备平坦时,您应该得到 OrientationEventListener.ORIENTATION_UNKNOWN
.
请参阅 Android landscape right to landscape left event 了解如何创建 OrientationEventListener
class 成员。
或者您可以保留代码不变,但还要检查设备倾斜度。如果设备是扁平的,则将 isLandscape
标志设置为适合您情况的任何值。有关如何计算设备倾角,请参阅 How to measure the tilt of the phone in XY plane using accelerometer in Android