SCREEN_ORIENTATION_LANDSCAPE倒置 - 为什么?

an0*_*00b 12 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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

它的工作原理,除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR)的情况下屏幕显示LANDSCAPE正确(!),然后调用doLock(true)和...

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

为什么这样,我如何处理这个问题才能解决它?

我的初步调查显示除了常见的两个(,)之外还有很多其他可能性,包括,但是我的预感告诉我这个问题可能取决于设备,所以通过使用它我可能只是为我的手机修复问题但不适用于所有其他设备.portraitlandscapereverseLandscape

有没有办法在所有设备中强制正确landscape定位(切换时sensor)?

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

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

pet*_*tey 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,当您将doLock(true)更改为"activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)"时会发生什么; 它还在逆转景观吗? (2认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)


ate*_*iob 6

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

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

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

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