这是我编写的一个处理屏幕方向锁定和解锁的类。我从切换按钮的checkedChangedListener中调用
toggleScreenOrientationLock(this, prefs, isChecked)
,并从onCreate()中调用
restoreScreenLock(this, prefs)
。在两种情况下,
this
是您的活动,而
prefs
是一个
SharedPrefences
对象,用于保存有关锁定状态的信息。
代码中复杂的部分是
getScreenOrientation()
函数,
我从这里借鉴并进行了清理。我将尝试解释它的工作逻辑。
当我们使用
setRequestedOrienation()
设置设备的方向时,我们需要知道设备是否处于横向或纵向模式,并且需要知道它是否是反向方向(旋转180度)。
使用
getResources().getConfiguration().orientation
可以回答我们所处的方向。如果我们能考虑设备的旋转,我们就可以知道它是否旋转了180度。不幸的是,根据设备的不同,ROTATE_0可能是纵向或横向的。手机通常将ROTATE_0映射到纵向,而平板电脑则映射到横向。
因此,在这里使用屏幕尺寸来确定它是横向还是纵向。如果屏幕比高度宽,则我们推断设备处于横向方向,反之亦然。然后我们可以考虑旋转来确定方向是否被反转。
例如,如果屏幕比高度宽,则我们知道我们处于横向方向。如果旋转角度为0或180(在代码逻辑中,这等于!isRotatedOrthogonally),则我们知道0是LANDSCAPE,而180是REVERSE_LANDSCAPE。
在其他地方已经注意到,这种方法不适用于所有设备,因为90度或270度的反转方向是特定于设备的。但这可能仍然是你能做的最好的方法;最坏的情况下,一个方向会在锁定时旋转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;
}
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);
}
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);
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);
吗? - MysticMagicϡ