【问题标题】:How do I get the angle/degree of the phone with sensor/s?如何获得带有传感器的手机的角度/度数?
【发布时间】:2015-07-11 20:08:17
【问题描述】:

我正在尝试使用 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) {
    }
};

只有在手机倾斜后才能获得手机角度的最佳方法是什么? 我很抱歉英语不好,

谢谢。

【问题讨论】:

  • 我不清楚你的目标。也许可以考虑使用加速度计来检测手机位置何时发生变化,并在变化停止后使用重力传感器来确定其方向。
  • 我担心使用 2 个不同传感器时的电池。与使用 1 个传感器相比,使用 2 个不同传感器的电池消耗有多糟糕?
  • 我不知道。我假设您在一个活动中进行此处理,并且只有在活动可见时才注册传感器。

标签: android android-sensors android-orientation


【解决方案1】:

我不知道我是否理解您的问题,但我认为您希望您的应用仅在手机处于纵向时才计算倾斜角度,首先您需要取 mSensorEvent.values[0] 的值,在这种情况下如果手机处于待机状态将返回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;
        }

    } 

【讨论】:

  • 我想要的只是获得倾斜角度(纵向或横向),而无需使用屏幕旋转功能。我正在尝试创建一个相机应用程序,所以我有一些图标,我希望它们在手机倾斜到横向/纵向时旋转和平移。所以我想我可以用传感器做到这一点。
  • 我现在的代码不能正常工作,因为它说 isLandscape = true;即使我将手机垂直平放在桌子上而没有倾斜。
  • @IYM-14 我已经更新了代码,所以你可以试试,我希望这就是你要找的。​​span>
  • 我刚刚测试过,这就是我想要的,谢谢!
  • 我正在查看这段代码,我想知道一些事情。这适用于仅在两侧倾斜手机的人。但是,如果该人以足够的力快速水平移动手机以达到超过 6 或低于 -6 的 X 值,这也将“起作用”,因为加速度计考虑了线性力。你如何解决这个问题?
【解决方案2】:

不用注册ACCELEROMETER 传感器,只需拥有OrientationEventListener 类型的类成员。当设备平坦时,您应该得到OrientationEventListener.ORIENTATION_UNKNOWN

请参阅 Android landscape right to landscape left event 了解如何创建 OrientationEventListener 类成员。

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

【讨论】:

  • 感谢 Hoan 的评论,但这不是我想要的,因为我的活动将关闭屏幕方向功能。这意味着无论我的手机是纵向还是横向,方向总是未知的。我不喜欢屏幕方向功能的原因是它每次更改方向时都会暂停我的应用程序。
  • 好的,我修改我的答案。
  • 感谢倾斜方法链接 Hoan,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2013-04-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多