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

それはなぜですか? また、この問題を修正するにはどうすればよいですか?

私の最初の調査では、一般的な 2 つ ( 、)以外にも、 を含むかなりの数の可能性があることが明らかになりましたが、この問題はデバイスに依存している可能性があり、それを使用することで、自分の電話の問題のみを修正できる可能性があることがわかりました。ただし、他のすべてのデバイスではありません。portraitlandscapereverseLandscape

すべてのデバイスでlandscape(から切り替えたときに)正しい向きを強制する方法はありますか?sensor

これをより明確にし、再現しやすくするために、問題を示す手順を次に示します。

  1. 画面が正しく表示された状態で ( ) 、ロック解除モード ( ) で、電話機を右 (時計回り) に回転させた状態から始めます (!)。SCREEN_ORIENTATION_SENSORLANDSCAPE
  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.reverseLandscapeandのscreenOrientation.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 に答える