切换全屏&像YouTube一样的方向

时间:2014-04-03 20:23:28

标签: android

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

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

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

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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

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

3 个答案:

答案 0 :(得分:18)

我有同样的问题。我最终得到的是使用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的文档:Documentation

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

答案 1 :(得分:1)

大tnx吸引人

是金,我被困了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()

答案 2 :(得分:0)

尝试从全屏退出时将“ RequestedOrientation”设置为SCREEN_ORIENTATION_SENSOR! 设置OrientationEventListener可能会导致资源意外使用。