Управление ориентацией от датчиков и запуск вручную - PullRequest
0 голосов
/ 22 июня 2019

У меня есть макет, который в настоящее время поддерживает изменение ориентации, перезаписывая onConfigurationChanged и упорядочивая виды на основе выбранной ориентации. Попытка поддержать ту же функциональность, вызывая ее с помощью кнопки просмотра «свернуть / развернуть», но изменение ориентации вызывается дважды с новой и старой ориентациями.

У меня есть adjustConfig(int orientation) метод, который заботится о перемещении видов, скрытии / показе того, что нужно - он выполняет свою работу.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    adjustConfig(newConfig.orientation);
    super.onConfigurationChanged(newConfig);

  //since fullScreeBtn blocks the orientation sensors, we enable it back 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
    }
}

public void adjustConfig (int orientation) {
// do some hide/show work based on the orientation type
}

fullScreeBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { setRequestedOrientation( getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? ActivityInfo.CREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } });

У меня есть кнопка полноэкранного режима / минимизации, которая вызывает setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) или setRequestedOrientation(ActivityInfo.CREEN_ORIENTATION_PORTRAIT) в зависимости от ориентации, которую я хочу изменить, и которая запускается по очереди onConfigurationChanged, которая обрабатывает мою конфигурацию, пока что все хорошо, но проблема в том, что, например, если я нахожусь на портрете и нажимаю на кнопку, чтобы переключиться для ландшафта поток работает и запускает onConfigurationChanged с новой конфигурацией ландшафта, которая вносит изменения, но затем немедленно вызывается onConfigurationChanged с текущим режимом, который является портретным, и я снова получаю исходное состояние - портрет.

РЕДАКТИРОВАТЬ: В настоящее время способ работы кода заключается в том, что вы можете либо начать физически вращать телефон и переключаться назад и вперед между портретным и альбомным режимом, либо нажимать на минимизированный / полный экран, но не на оба, начиная с момента, когда я звоню setRequestedOrientation в fullScreeBtn он вызывает ориентацию и отключает прослушивание датчика, поэтому, когда я нажимаю на полный экран, он поворачивает экран так, как я хочу, затем поворачиваю телефон, чтобы увидеть его, но с этого момента я застрял так как я не могу повернуть назад физически, только снова нажав на свернутое изображение.

Моя цель - иметь поддержку датчиков и ручного режима, поэтому, если я нажму fullScreeBtn, он переключится в ландшафтный режим, и пользователю потребуется повернуть телефон, чтобы настроить комфортный вид, точно так же, как YouTube делает сегодня.

1 Ответ

0 голосов
/ 22 июня 2019

Вы говорите:

  1. проблема в том, что, например, если я нахожусь на портрете и нажимаю на кнопка для переключения в ландшафт, поток работает и стартует onConfigurationChanged с новой конфигурацией ландшафта, которая делает изменение

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

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

Просто чтобы убедиться, что не осталось важных деталей:

  • Вы случайно не слушаете OrientationEventListener в своем приложении?
  • У вас есть логика в onConfigurationChanged, которая задает запрошенную ориентацию?

ОБНОВЛЕНИЕ после добавления дополнительной информации:

Хорошо, теперь это имеет смысл.

Смотри, чтобы добиться желаемого поведения, как в Youtube, скорее всего, тебе потребуется задействовать в игре еще один компонент, он называется: OrientationEventListener .

Этот слушатель позволяет прослушивать изменения ориентации непосредственно с датчика.

Неважно, заблокировано ли задание в определенной ориентации.

Однако это немного сложнее, этот слушатель сообщает текущую ориентацию устройства в градусах, от 0 до 359, вам придется выяснить, какой диапазон градусов соответствует альбомной или портретной ориентации.

Основная идея следующая:

  • Кнопка свернуть / развернуть заблокирует действие в определенной ориентации, как вы делаете это прямо сейчас.

  • Ваша реализация OrientationEventListener будет прослушивать в фоновом режиме ориентацию устройства. Если ориентация устройства будет совпадать с ориентацией активности, то есть устройство будет в горизонтальной ориентации, а деятельность также в горизонтальной (или наоборот), вы сбросите ориентацию активности обратно на ActivityInfo.SCREEN_ORIENTATION_SENSOR. С этого момента ваша активность не будет заблокирована в определенной ориентации, но начните снова следовать за датчиком.

  • Удалите setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); из onConfigurationChanged(), так как теперь этот шаг обрабатывается, как описано выше.

Для начала начнем изучать OrientationEventListener. На SO есть примеры, как его использовать.

...