2015-07-11 129 views
2

我想通过使用TYPE_ACCELEROMETER传感器来获取电话角度。 我的目标是在手机倾斜后才能获取角度值。 它的工作原理,但问题是当我把手机正对着桌子时, 它仍然说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) { 
    } 
}; 

只有在手机倾斜后才能获得手机角度的最佳方式是什么? 对不起,我的英语很差,

谢谢。

+0

我不清楚您的目标。也许可以考虑使用加速度计来检测手机位置何时发生变化,以及重力感应器在更改停止后确定其方向。 –

+0

使用2个不同的传感器时,我关心的是电池。与1个传感器相比,使用2个不同传感器的电池消耗有多大? –

+0

我不知道。我假设你在一个活动中进行这个处理,并且只有当活动可见时才会注册传感器。 –

回答

2

我不知道我是否理解你的问题,但我认为你只是想让你的应用程序计算倾斜的天使,只要手机是肖像,首先你需要取mSensorEvent.values[0]的值,在这种情况下,如果处于待机状态的手机将返回0,向右倾斜将从1到9为负值,左侧为正值。例如(9是完美的展位),那么你必须做所有这些,只是在mSensorEvent.values[1]的值在9和7之间(例如9)。确保设备处于纵向位置。

,如果你需要的度角的值,可以通过10

我希望这会帮助你

UPDATE ***

你可以试试这个繁衍的mSensorEvent.values浮点值:

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; 
     } 

    } 
+0

我只需要获得倾斜角度(纵向或横向),而无需使用屏幕旋转功能。我正在尝试创建一个相机应用程序,因此当手机倾斜到横向/纵向时,我想让它们旋转和翻译图标。所以我想我可以用传感器做到这一点。 –

+0

我现在的代码不能正常工作,因为它说isLandscape = true;即使我把手机垂直放在桌子上而不倾斜它。 –

+0

@ IYM-14我已经更新了代码,所以你可以试试它,我希望这是你正在寻找的。 –

1

而不是注册ACCELEROMETER传感器,只需要一个类型为OrientationEventListener的成员。当设备是平坦的,你应该得到OrientationEventListener.ORIENTATION_UNKNOWN

有关如何创建OrientationEventListener类成员的信息,请参见Android landscape right to landscape left event

或者您可以保留您的代码,但也可以检查设备倾向。如果设备是扁平的,则将isLandscape标志设置为适合您的情况。有关如何计算设备倾角,请参阅How to measure the tilt of the phone in XY plane using accelerometer in Android

+0

感谢评论Hoan,但这不是我想要的,因为我的活动将关闭屏幕方向功能。这意味着,无论我的手机是纵向还是横向,方向都将始终未知。我不喜欢屏幕方向功能的原因是每次改变方向时它都会暂停我的应用程序。 –

+0

好的,我修改我的答案。 –

+0

谢谢倾斜方法链接Hoan,谢谢! –