【问题标题】:orientation lock in android programmatically以编程方式在android中锁定方向
【发布时间】:2013-11-26 05:53:25
【问题描述】:

我有以下代码。

Java

public void lockScreenOrientation() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}

public void unlockScreenOrientation() {
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}

我从 javascript 调用这些函数。控制正在进入这些方法。但是方向没有锁定。

我已尝试跟随锁定方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

这些似乎都不起作用。任何指针都会有所帮助。

【问题讨论】:

  • 你试过setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 吗?
  • 您需要哪种定位模式?
  • 我想锁定方向。如果是横向,我想将其锁定为横向,如果是纵向,我想将其锁定为纵向。两者都不起作用。所以我试图锁定横向以进行测试。
  • 尝试 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);在那之后 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);在设置内容视图之前尝试使用它。
  • 尝试了所有这些 - ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR、ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED、ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

标签: java android screen-orientation


【解决方案1】:
Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);


将屏幕(活动)锁定在任何方向。

需要 API 级别 >= 18

【讨论】:

    【解决方案2】:

    我创建了一些实用方法来帮助处理方向锁定,请随意使用这个类。

    使用示例:

    • 在活动中:OrientationUtils.lockOrientationPortrait(MyActivityName.this)
    • 在片段中:OrientationUtils.lockOrientationLandscape(getActivity())

    代码:

    /** Static methods related to device orientation. */
    public class OrientationUtils {
        private OrientationUtils() {}
    
        /** Locks the device window in landscape mode. */
        public static void lockOrientationLandscape(Activity activity) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    
        /** Locks the device window in portrait mode. */
        public static void lockOrientationPortrait(Activity activity) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    
        /** Allows user to freely use portrait or landscape mode. */
        public static void unlockOrientation(Activity activity) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        }
    
    }
    

    这是我在 GitHub 上的完整 OrientationUtils 类,可用于任何 Android 应用程序:https://github.com/danialgoodwin/android-simply-advanced-helper/blob/master/SimplyAdvancedHelperLibrary/src/net/simplyadvanced/utils/OrientationUtils.java

    【讨论】:

      【解决方案3】:

      这是我编写的用于处理锁定和解锁屏幕方向的类。我从切换按钮的checkedChangedListener 调用toggleScreenOrientationLock(this, prefs, isChecked),从onCreate() 调用restoreScreenLock(this, prefs)。在这两种情况下,this 是您的活动,prefsSharedPrefences 对象,用于保存有关锁状态的信息。

      代码中复杂的部分是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 是反向方向是特定于设备的。但这仍然可能是您要做的最好的事情;在最坏的情况下,当您锁定某个方向时,它会旋转 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();
          }
      }
      

      【讨论】:

        【解决方案4】:

        这是另一个对我很有效的简单解决方案。

        private void orientationManager(boolean lock)
        {
            int currentOrientation = getResources().getConfiguration().orientation;
            if(lock)
            {
                if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE)
                {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
                }
                else
                {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
                }
            }
            else
            {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
            }
        }
        

        我需要在打开对话框时锁定orientationManager(true);当前屏幕方向,并在关闭对话框时解锁orientationManager(false);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2011-05-25
          • 2011-05-31
          • 2012-12-13
          • 1970-01-01
          相关资源
          最近更新 更多