画面を時計回りに90度回転して横向きにすると画面が逆さまになる不具合が発生した。原因はmanifestで横画面のactivityにandroid:screenOrientation="landscape"を設定していることだった。 landscapeは反時計回りに90度回転して横向きにした向きのことで、時計回りに90度回転して横向きにした向きはreverseLandscapeであるらしい。 どちらの向きでも逆さまにならないようにするにはuserLandscapeにすればよい。これは端末の向きを横にした場合画面を横向きにするが、ユーザが端末設定で回転をロックしている場合は横にしないという設定。
orientationは似た設定がいっぱいあって紛らわしいのでまとめてみた。
設定 | 効果 | 使用できるAPIレベル |
---|---|---|
unspecified | いくつかの端末で確認したところuserと同じ挙動だった。が、公式ドキュメントによると端末にベストなorientationを決めさせるよ!と書いてあるので端末毎の挙動が違いそう。ある端末ではなぜか画面が回転しない!といったトラブルを避けるためには使わない方がいいかも。 | level 1 |
landscape | 縦向きから反時計回りに90度回転した向き。端末の向き・ユーザの端末設定は無視する。 | level 1 |
portrait | 縦向き。端末の向き・ユーザの端末設定は無視する。 | level 1 |
user | 端末の向きを変えると画面の向きも変わる。ただし、ユーザが端末設定で回転をロックしている場合は変わらない | level 1 |
behind | activity stack の直下の activity と同じ向き | level 1 |
sensor | 端末の向きを変えると画面の向きも変わる。ユーザの端末設定は無視する。 | level 1 |
nosensor | 現在の向きに固定する | level 1 |
sensorLandscape | 端末の向きを変えると画面の向きも変わる。ただし、横向きのみ。ユーザの端末設定は無視する。 | level 9 |
sensorPortrait | 端末の向きを変えると画面の向きも変わる。ただし、縦向きのみ。ユーザの端末設定は無視する。 | level 9 |
reverseLandscape | 縦向きから時計回りに90度回転した向き。端末の向き・ユーザの端末設定は無視する。 | level 9 |
reversePortrait | 端末を逆さまにした向き(portraitから180度回転した向き)。端末の向き・ユーザの端末設定は無視する。 | level 9 |
fullSensor | 端末の向きを変えると画面の向きも変わる。ユーザの端末設定は無視する。公式ドキュメントには「sensorとの違いは0,90,180,270度すべての方向に回転できるところ」と書いてあるが、手元の端末で設定をsensorにしてもすべての方向に回転できたし何が違うのか分からない。。 | level 9 |
userLandscape | 端末の向きを変えると画面の向きも変わる。ただし、横向きのみ。ユーザが端末設定で回転をロックしている場合は変わらない | level 18 |
userPortrait | 端末の向きを変えると画面の向きも変わる。ただし、縦向きのみ。ユーザが端末設定で回転をロックしている場合は変わらない | level 18 |
fullUser | 端末の向きを変えると画面の向きも変わる。ただし、ユーザが端末設定で回転をロックしている場合は変わらない。公式ドキュメントには「userとの違いは0,90,180,270度すべての方向に回転できるところ」と書いてあるが、手元の端末で設定をuserにしてもすべての方向に回転できたし何が違うのか分からない。。 | level 18 |
locked | 現在の向きに固定する | level 18 |
イマイチ不明なところは以下。
- nosensorとlockedの違い
- sensorとfullSensorの違い
- userとfullUserの違い
あと、一部APIレベルが18とか割と最近のバージョンになっているので注意。 lockedをAPI level18未満の端末でlockedを指定するとunspecifiedと同じ挙動になっているようだった。例外は投げられない。
参考:
http://developer.android.com/reference/android/R.attr.html#screenOrientation