【问题标题】:SCREEN_ORIENTATION_LANDSCAPE upside down - Why?SCREEN_ORIENTATION_LANDSCAPE 倒置 - 为什么?
【发布时间】:2012-08-21 16:44:06
【问题描述】:

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

 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)。

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

我最初的询问显示除了常见的两个(portraitlandscape)之外还有quite a few的可能性,包括reverseLandscape,但我的直觉告诉我这个问题可能是device-dependent等等使用它我可能只针对我的手机解决问题,而不是针对所有其他设备。

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

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

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

【问题讨论】:

    标签: android android-sensors android-orientation


    【解决方案1】:

    尝试以下通过代码禁用和启用方向(这将在 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 获取详细答案。但是,您的代码表现出我在上面描述的完全相同的问题。我还是很疑惑。
    • 出于好奇,当您将 doLock(true) 更改为“activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);”时会发生什么还是逆景吗?
    • 当方向为纵向时,您应该更改为横向,反之亦然。
    【解决方案2】:

    简单实用>

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 天哪,你是对的!当我将手机向左旋转时,然后将其锁定到setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 它工作正常。当我向右旋转手机并做同样的事情时,它当然会保留在SCREEN_ORIENTATION_LANDSCAPE 中。当我向右旋转手机,然后将其锁定到setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 时,它实际上是portrait!。看起来它在 Froyo 中被忽略了。我用 Gingerbread 尝试了同样的方法,但没有出现问题。
      • @an00b 很高兴我能帮上忙。另请注意,activity.getWindowManager().getDefaultDisplay().getOrientation()onCreate() 中得到修复。也就是说,在onResume() 中,您仍将获得在onCreate() 中检索到的值,即使您在onResume() 之前旋转了手机。
      【解决方案4】:

      尝试通用横向方向

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

      【讨论】:

        猜你喜欢
        • 2018-08-14
        • 2012-01-10
        • 2020-09-15
        • 2022-10-04
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多