SCREEN_ORIENTATION_LANDSCAPE倒置 - 为什么?

时间:2012-08-21 16:44:06

标签: android android-sensors android-orientation

我使用以下代码为每个用户首​​选项设置方向锁定:

 private void doLock(boolean locked) {
     if (locked) {
       int o = getResources().getConfiguration().orientation;
       if (o == Configuration.ORIENTATION_LANDSCAPE)
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);       
       else if (o == Configuration.ORIENTATION_PORTRAIT)
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);       
     } 
     else {
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
     }
 }

除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR)并且屏幕正确显示LANDSCAPE(!),然后调用doLock(true)并且...... < / p>

而不是在当前(正确)横向视图中将屏幕锁定到LANDSCAPE,而是锁定到倒置横向视图。即同样精确但垂直翻转(y变为-y)。

为什么会这样,我该如何解决这个问题?

我的初步调查显示除了常见的两个(portraitlandscape)之外还有quite a few种可能性,包括reverseLandscape,但我的预感告诉我这个问题可能是device-dependent,所以通过使用它我可能只是为我的手机而不是所有其他设备解决问题​​。

有没有办法在所有设备中强制执行landscape方向(从sensor切换时)?

为了使这个更清晰,更容易重现,以下是显示问题的步骤:

  1. 开始时手机向右旋转(顺时针),处于解锁模式(SCREEN_ORIENTATION_SENSOR),屏幕正确显示LANDSCAPE(!),
  2. 然后调用doLock(true)
  3. 而不是在当前(正确)横向视图中将屏幕锁定到LANDSCAPE,而是锁定到倒置横向视图。即完全相同但垂直翻转(y变为-y)。

4 个答案:

答案 0 :(得分:9)

请尝试以下操作以通过代码禁用和启用方向(这将在API级别7及更高版本中运行):

public static void disableRotation(Activity activity) {
    final int orientation = activity.getResources().getConfiguration().orientation;
    final int rotation = activity.getWindowManager().getDefaultDisplay()
            .getOrientation();

    // Copied from Android docs, since we don't have these values in Froyo
    // 2.2
    int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
    int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
        SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    }

    if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    } else if (rotation == Surface.ROTATION_180
            || rotation == Surface.ROTATION_270) {
        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
            activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
            activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
    }
}

public static void enableRotation(Activity activity) {
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

答案 1 :(得分:7)

简单实用&gt;

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

    <activity
        android:screenOrientation="sensorLandscape"
    </activity>

  </application>

答案 2 :(得分:6)

您所描述的不是错误,而是Android 2.2或更低版本的预期行为。

@forgivegod提供了一个理论上正确的方法,除了对于Android 2.2或更低版本,screenOrientation.reverseLandscapescreenOrientation.reversePortrait值无法识别,即使是伪造的(如@forgivegod的代码那样)。

我打赌你顺时针旋转手机(旋转= 3)而不是逆时针旋转(旋转= 1)时会看到这个问题。

尝试使用Android 2.3或更高版本,看看会发生什么。

答案 3 :(得分:2)

尝试使用通用横向

private static final int ORIENTATION_90 = 1;
private static final int ORIENTATION_0 = 0;
private static final int ORIENTATION_180 = 2;
private static final int ORIENTATION_270 = 3;

switch (orientation)
    {
      default:
      case ORIENTATION_0: // Portrait
        //dostuff
        break;
      case ORIENTATION_90: // Landscape left
        //do stuff
        break;
      case ORIENTATION_180: // Upside down.
        //do stuff
        break;
      case ORIENTATION_270: // Landscape right
        //do stuff
        break;
      }