12

我正在使用以下代码根据用户偏好设置方向锁定:

 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)并...

而不是屏幕锁定LANDSCAPE在其当前(正确的)横向视图中,它锁定到一个倒置的横向视图。即完全相同但垂直翻转(y变为-y)。

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

我的初步调查表明,除了常见的两个 ( , )之外还有很多可能性,包括但不适用于所有其他设备。portraitlandscapereverseLandscape

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

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

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

4 回答 4

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);
}
于 2012-08-21T17:20:08.247 回答
8

简单实用>

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

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

  </application>
于 2014-11-07T01:11:52.657 回答
6

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

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

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

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

于 2012-08-21T19:14:06.917 回答
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;
      }
于 2012-08-21T16:51:04.560 回答