2011-02-23 50 views
12

我想这样做:如何在支持自然景观设备的情况下检测左(正常)景观和右景(逆向)景观?

  • 检测设备的当前布局的方向(肖像,风景,左,人像(倒挂),景观 - 右)
  • 区分这两种可能的横向模式之间(靠在左侧,靠在右边)有景观为自然状态
  • 支持设备(for examplediscussed here
  • 支持< 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()。方向,但可以告诉它是横向模式。

回答

2

右边的景观直到2.2才被支持。 你需要有< 2.2设备选择选项或其他东西。

+0

你是什么意思支持?我有一个2.1设备(和模拟器)可以旋转到任何横向模式。 – cottonBallPaws 2011-02-23 17:20:52

+0

@littleFluffyKitty这是一个可以接受的答案,因为它没有真正回答这个问题(这是一个很好的问题),这真是一种耻辱。 FWIW,'getOrientation'等同于'getRotation',弃用仅仅是因为它在2.2中被重命名。自API级别1以来,该功能一直存在。 – 2011-09-08 03:44:12

0

我设法克服这种(不打算API 8)的唯一方法是通过注册到的SensorManager(Sensor.TYPE_ACCELEROMETER),并得到onSensorChanged事件。

我注意到,当你的屏幕在横向模式下,你将获得接近值-9在latheral(X)轴(g)或+9(克)。 你可以检查阳性或阴性,但你需要保存在设备中被放回到桌子上用脸向上

你的代码(段)应大致样子的情况下,状态:

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

它帮助了我,希望这会帮助你。