像YouTube一样切换全屏和方向

  • 本文关键字:方向 一样 YouTube android
  • 更新时间 :
  • 英文 :


我试图模仿在视频播放器中单击"全屏"按钮时YouTube Android应用程序的行为:

  • 如果设备当前处于纵向状态,请立即旋转为横向(即使用户仍以纵向方式握持设备)并保持横向状态,直到用户将设备旋转为横向,然后旋转回纵向
    • 如果设备当前处于横向状态,请立即旋转为纵向(即使用户仍以纵向方式握持设备)并保持纵向,直到用户将设备旋转为纵向,然后旋转回横向。
    • 在任何时候,允许用户手动将其设备旋转到所需的方向。

似乎如果我使用以下方法强制旋转为横向或纵向:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

。我立即失去了检测传感器方向变化的能力(即,一旦用户处于横向状态,他们想要手动将设备旋转回纵向)。

如果我在 onConfigurationChanged 中将请求的方向更改为未指定或传感器,则方向会短暂翻转到横向/纵向(无论我从上面请求什么),然后回响到与设备保持方式匹配的方向。

关于如何实现上述目标的任何想法?

我遇到了同样的问题。我最终得到的是使用OrientationListener来检测用户何时实际将手机倾斜到横向,然后将方向设置为SCREEN_ORIENTATION_SENSOR。

OrientationEventListener orientationEventListener = 
new OrientationEventListener(getActivity()) {
    @Override
    public void onOrientationChanged(int orientation) {
        int epsilon = 10;
        int leftLandscape = 90;
        int rightLandscape = 270;
        if(epsilonCheck(orientation, leftLandscape, epsilon) ||
           epsilonCheck(orientation, rightLandscape, epsilon)){
                getMainActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
            }
        }
        private boolean epsilonCheck(int a, int b, int epsilon) {
            return a > b - epsilon && a < b + epsilon;
        }
    };
    orientationEventListener.enable();

以下是 OrientationEventListener 的文档:

您还需要添加 肖像检查 ,因为您在原始帖子中描述了需要它。

Big tnx to havch

它是金子,我被困在上面5个小时。这是我的 kotlin 代码来处理它。

orientationEventListener = object: OrientationEventListener(this) {
            override fun onOrientationChanged(orientation: Int) {
                val isPortrait = orientation > 300 || orientation < 60 || orientation in 120..240
                if ((requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && isPortrait) ||
                    (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && !isPortrait)){
                    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR
                }
            }
        }
        orientationEventListener.enable()

亚历山大代码的这种修改对我来说效果更好

   object : OrientationEventListener(requireContext()) {
        override fun onOrientationChanged(orientation: Int) {
            val isPortrait = orientation > 345 || orientation < 15 || orientation in 165..195
            val isLandscape = orientation in 255..285 || orientation in 75..105
            if (
                (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && isPortrait) ||
                (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && isLandscape)
            ) {
                lifecycleScope.launch {
                    // adding a delay to avoid orientation change glitch
                    delay(200)
                    activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR
                }
            }
        }
    }
/**
     * -1 -> Unknown
     * 1 -> Portrait
     * 0 -> Landscape
     */
    var previousOrientation = -1
    val orientationEventListener: OrientationEventListener =
        object : OrientationEventListener(this) {
            override fun onOrientationChanged(orientation: Int) {
                val isPortrait = (orientation > 340 || orientation < 20 || orientation in 160..200) &&
                        requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT
                val isLandscape = (orientation in 250..290 || orientation in 70..110) &&
                        requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE
                if (isPortrait || isLandscape) {
                    lifecycleScope.launch {
                        if (previousOrientation == -1) {
                            previousOrientation = if (isPortrait) 1 else 0
                        }
                        delay(700)
                        val currentOrientation = if (isPortrait) 1 else 0
                        if (previousOrientation == currentOrientation) {
                            previousOrientation = -1
                            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR
                        }
                    }
                }
            }
        }
    orientationEventListener.enable()

这个可以更正确地处理方向故障。此代码是@Buntupana发布的内容的改进版本

尝试将请求的方向设置为SCREEN_ORIENTATION_SENSOR退出全屏时!设置 OrientationEventListener 可能会导致一些意外的资源使用。

最新更新