как обрабатывать повороты просмотров, как это делает youtube на Android?

#android #screen-orientation #autorotate #device-orientation #onconfigurationchanged

Вопрос:

Я хочу добиться того, как youtube обрабатывает свою ориентацию видео.

Есть несколько вещей, которые нужно иметь в виду, прежде чем просто сказать, что я должен использовать onConfigurationChanged.


О ЧЕМ СЛЕДУЕТ ПОДУМАТЬ

  1. Ориентация телефона. Это означает, как вы держите телефон. Это может быть ПОРТРЕТ или ПЕЙЗАЖ
  2. Ориентация экрана. Это означает, как отображается представление. Это может быть ПОРТРЕТ или ПЕЙЗАЖ, независимо от ориентации телефона

КАК РАБОТАЕТ РОТАЦИЯ НА YOUTUBE?

  1. Если телефон находится в ПОРТРЕТНОМ режиме (с помощью быстрых настроек ОС)
  • Экран будет сохраняться в ПОРТРЕТНОМ режиме. Не имеет значения, поворачиваете ли вы телефон
  • Единственный способ повернуть экран-это нажать кнопку повернуть.
  • Экран будет оставаться в последней выбранной ориентации, и она не изменится, даже если вы повернете телефон. ПОРТРЕТ останется ПОРТРЕТОМ, а ПЕЙЗАЖ останется ПЕЙЗАЖЕМ.
  1. Если телефон находится в режиме АВТОМАТИЧЕСКОГО ПОВОРОТА
  • если вы поворачиваете телефон, за ним следует поворот экрана. Я имею в виду, что если телефон находится в ПОРТРЕТНОМ режиме, то экран будет ПОРТРЕТНЫМ. И то же самое происходит с ЛАНДШАФТОМ.
  • если нажать кнопку поворота, ориентация экрана изменится независимо от ориентации телефона. В этом случае единственный способ прослушать ориентацию датчика-повернуть телефон в ту же сторону поворота экрана и вернуться назад. Это делается для того, чтобы датчик телефона снова мог контролировать ориентацию.

ЧТО У МЕНЯ ЕСТЬ?

С помощью onConfigurationChanged я мог бы знать, когда поворачиваю телефон (если включен АВТОМАТИЧЕСКИЙ ПОВОРОТ), и определить макет:

 override fun onConfigurationChanged(newConfig: Configuration) {
     when (newConfig.orientation) {
         Configuration.ORIENTATION_PORTRAIT -> buildPortrait()
         Configuration.ORIENTATION_LANDSCAPE -> buildLandscape()
     }

     super.onConfigurationChanged(newConfig)
}
 

С помощью кнопки поворота я могу управлять ориентацией экрана (когда телефон находится в ПОРТРЕТНОМ режиме, ЗАБЛОКИРОВАННОМ ОС).

 fun rotate() {
        val orientation = requireActivity().requestedOrientation
        val isRotationOn = Settings.System.getInt(requireActivity().contentResolver,
                Settings.System.ACCELEROMETER_ROTATION, 0) == 1

        requireActivity().requestedOrientation = if (isRotationOn) {
            // AUTO-ROTATE enabled
           TODO()
        } else 
            // PORTRAIT BLOCKED
            if (orientation == PORTRAIT) {
                buildLandscape()
            LANDSCAPE
        } else {
                buildPortrait()
            PORTRAIT
        }
    }
 

WHAT I CAN’T ACHIEVE?
I don’t know how to handle screen rotation when I have the AUTO-ROTATE enabled that handles the rotation by the sensor, and at the same time, there is a rotate button that does a rotation regardless of the AUTO-ROTATE.


IMPORTANT: I can’t find any example with the solution anywhere.