これは、画面の向きのロックとロック解除を処理するために書いたクラスです。私は、トグルボタンのcheckedChangedListenerからtoggleScreenOrientationLock(this, prefs, isChecked)
を呼び出し、onCreate()からrestoreScreenLock(this, prefs)
を呼び出します。いずれの場合も、this
があなたの活動であり、prefs
はSharedPrefences
オブジェクトであり、ロックの状態に関する情報を保存するために使用されます。
コードの複雑な部分は、getScreenOrientation()
機能、which I stole from and cleaned up from hereです。私はこの仕組みの背後にある論理を説明しようとします。
デバイスの向きをsetRequestedOrienation()
に設定すると、デバイスが横向きまたは縦向きのモードかどうかを知る必要があり、逆向き(180度回転)かどうかを知る必要があります。
getResources().getConfiguration().orientation
を使用すると、私たちがどの向きにいるのかという質問に答えることができます。デバイスの回転を考慮することができれば、それが180度回転したかどうかを知ることができます。残念ながら、デバイスによっては、ROTATE_0がポートレートまたはランドスケープである可能性があります。携帯電話は通常、ROTATE_0をポートレートに、タブレットをランドスケープにマッピングします。
ここで使用されているソリューションは、スクリーンの寸法を使用して、横または縦になっているかどうかを判断することです。画面の幅が画面の幅より広い場合は、デバイスが横向きであることが推測され、縦向きの場合は逆も同様です。次に、向きを逆転させるかどうかを判断するために、回転を考慮に入れることができます。
たとえば、画面の高さが画面の幅より広い場合は、横向きになっていることがわかります。ローテーションが0または180の場合(コードのロジックでは!isRotatedOrthogonallyに等しい)、0がLANDSCAPE、180がREVERSE_LANDSCAPEであることがわかります。
It has been noted elsewhereこれは、90または270のどちらかが逆向きであるかどうかはデバイス固有であるため、すべてのデバイスで機能しないことを意味します。しかしこれはおそらくあなたがやるべき最高のものです。最悪の場合、1つの向きが180度回転します。これは、画面を他の方法でロックしようとすると起こりそうなことです。
public class ScreenLocker {
final private static String ROTATION_LOCKED_KEY = "LockedOrientationVal";
final private static String ROTATION_IS_LOCKED_KEY = "IsRotationLocked";
final private static String ROTATION_SAVED_KEY = "SavedOrientationVal";
public static int getScreenOrientation(Activity activity) {
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getRotation();
Point size = new Point();
display.getSize(size);
final boolean isWiderThanTall = size.x > size.y;
final boolean isRotatedOrthogonally = (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270);
int orientation;
if (isRotatedOrthogonally) {
if (isWiderThanTall)
orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
else
orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // normal and reversed switched intended
}
else {
if (isWiderThanTall)
orientation = (rotation == Surface.ROTATION_0) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
else
orientation = (rotation == Surface.ROTATION_0) ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
return orientation;
}
public static void toggleScreenOrientationLock(Activity activity,SharedPreferences prefs, boolean lock) {
if(lock)
lockScreenOrientation(activity, prefs);
else
unlockScreenOrientation(activity, prefs);
}
// call this from your activity's onCreate() or onResume()
public static boolean restoreScreenLock(Activity activity, SharedPreferences prefs) {
final boolean isLocked = prefs.getBoolean(ROTATION_IS_LOCKED_KEY, false);
final int previousLockedOrientation = prefs.getInt(ROTATION_LOCKED_KEY, -999);
if(isLocked && previousLockedOrientation != -999) {
prefs.edit().putInt(ROTATION_SAVED_KEY, activity.getRequestedOrientation()).apply();
activity.setRequestedOrientation(previousLockedOrientation);
return true;
}
return false;
}
private static void lockScreenOrientation(Activity activity, SharedPreferences prefs) {
final int currentOrientation = activity.getRequestedOrientation();
final int lockOrientation = getScreenOrientation(activity);
// checking isCurrentlyLocked prevents the ROTATION_LOCKED_KEY and ROTATION_SAVED_KEY
// becoming identical, which results in the screen not being able to be unlocked.
final boolean isCurrentlyLocked = prefs.getBoolean(ROTATION_IS_LOCKED_KEY, false);
if(!isCurrentlyLocked) {
activity.setRequestedOrientation(lockOrientation);
prefs.edit()
.putInt(ROTATION_SAVED_KEY, currentOrientation)
.putInt(ROTATION_LOCKED_KEY, lockOrientation)
.putBoolean(ROTATION_IS_LOCKED_KEY, true)
.apply();
}
}
private static void unlockScreenOrientation(Activity activity, SharedPreferences prefs) {
final int savedOrientation = prefs.getInt(ROTATION_SAVED_KEY, activity.getRequestedOrientation());
activity.setRequestedOrientation(savedOrientation);
prefs.edit().putBoolean(ROTATION_IS_LOCKED_KEY, false).apply();
}
}
'setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);を試しましたか? 'と' setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); '? –
どの方向モードが必要ですか? – GrIsHu
向きを固定したい。風景の場合は風景に固定し、縦の場合は肖像画に固定したいと思っています。両方とも動作していません。だから私はテスト目的のために横長の向きにロックしようとしています。 – user2682527