如何检测支持自然横屏的设备中的左横屏(正常)和右横屏(反向)?

12

我希望实现以下功能:

  • 检测设备当前的布局方向(纵向、左横屏、倒立纵向、右横屏)
  • 区分两种可能的横屏模式(向左或向右倾斜)
  • 支持自然状态为横屏的设备(例如在此处讨论
  • 支持低于 2.2 版本的设备(无法使用 getRotation() 方法)

仅想澄清一下,我想知道当前布局的方向。布局底部是哪个方向?是纵向还是横向?如果是横向,是向左还是向右?等等。

最接近的方法是 Activity.getResources().getConfiguration().orientation,但它只返回三个可能的值:ORIENTATION_LANDSCAPE、ORIENTATION_PORTRAIT 或 ORIENTATION_SQUARE。它没有说明横屏的类型。

所以,我想,如果我能够获取设备的方向值(如90、180、270等)并将其与上述配置值进行比较,我就可以弄清楚。例如,如果配置值为ORIENTATION_LANDSCAPE,并且方向为270,则我可以告诉它处于反向横向模式。然而,似乎没有一种简单的方法来获取方向值。我可以实现一个OrientationEventListener,但那似乎过度了,因为我只需要在特定时间获取一次值,而不是不断地获取。

在Display类中有两个值,但getOrientation已被弃用,而getRotation仅适用于2.2及以上版本。

即使我得到了这个值,仍然存在设备自然横向的问题。这意味着它们的0值将是横向而不是纵向。因此,我还需要确定哪个(左横向、右横向或纵向)对应于0的确切方式。

SO上有很多关于方向和类似问题的帖子,但我没有看到任何一个考虑所有这些问题的。有人解决了这个问题吗?

最后,我想要像Activity.getResources().getConfiguration().orientation这样的东西,但能够告诉它是哪种横向模式。

2个回答

2

直到2.2版本之前,不支持横屏模式。你需要在选项中选择<2.2设备。


什么是支持的意思?我有一个2.1设备(和模拟器),可以旋转成横向或纵向模式。 - cottonBallPaws
@littleFluffyKitty 这个被接受的答案有点可惜,因为它并没有真正回答问题(而这是一个好问题)。顺便说一下,getOrientation 等同于 getRotation,它被弃用只是因为在2.2中被重命名了。这个功能从API level 1就已经存在了。 - Andrew Russell

0

我设法克服这个问题的唯一方法(而不是去API 8)是通过注册SensorManager(Sensor.TYPE_ACCELEROMETER)并获取onSensorChanged事件。

我注意到当您的屏幕处于横向模式时,您将在横向(x)轴上获得接近-9(g)或+9(g)的值。 您可以检查正数或负数,但需要在设备放回桌面并面朝上的情况下保存状态

您的代码(片段)应大致如下:

private float mShiftAngle = 0;

public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        aValues = event.values; 
        int deviceRot = getResources().getConfiguration().orientation; 
        if (deviceRot == Configuration.ORIENTATION_LANDSCAPE) {
            if (Math.abs(aValues[0])>4)
                mShiftAngle = (aValues[0]>0 ? 90 : -90);
        }
        else 
            mShiftAngle = 0;       
    }
}

它帮助了我,希望它也能帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接