Toggling полноэкранного режима & ориентации, как YouTube

Обновить

November 2018

Просмотры

2k раз

7

Я пытаюсь имитировать поведение приложения YouTube для Android, когда кнопка «полноэкранный режим» щёлкнули в видеоплеера:

  • Если устройство находится в настоящее время в портретном, сразу повернуть на альбомную (даже если пользователь все еще держит устройство в портрете) и остаются в пейзаже, пока пользователь не вращает устройство на альбомную, а затем поворачивает обратно к портрету
    • Если устройство находится в настоящее время в пейзаже, сразу повернуть в портретный (Даже если пользователь все еще держит устройство в портрете) и остается в портретном, пока пользователь не вращает устройство к портрету и затем поворачивает обратно в пейзаж.
    • В любое время, позволяют пользователю вручную повернуть их устройство в нужной ориентации.

Кажется, что если я заставляю вращение на пейзаж или портрет с помощью:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

или же

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

... Я сразу же теряю способность обнаруживать изменения ориентации датчика (то есть, когда пользователь находится в пейзаже, и они хотят, чтобы вручную повернуть устройство обратно к портрету).

Если изменить требуемую ориентацию, чтобы не определен или датчик в onConfigurationChanged, ориентация на короткое время переворачивается пейзаж / портрет (все, что запрошенного от указанного выше), а затем защелкивается обратно к ориентации, который соответствует, как проходит устройство.

Любые мысли о том, как достичь своих целей выше?

2 ответы

17

I had the excact same problem. What I ended up with was using an OrientationListener to detect when the user had actually tilted the phone to landscape and then setting the orientation to 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();

Here is the documentation for OrientationEventListener : Documentation

You would also need to add checks for portrait , because you described needing that in your original post.

0

Try to setRequestedOrientation to SCREEN_ORIENTATION_SENSOR when exit from fullscreen ! setting OrientationEventListener may cause some unexpected resources usage.