Чередовать предложения

В Android 8.0 пользователи могли переключаться между режимами автоматического и книжного поворота с помощью плитки быстрых настроек или настроек дисплея. В Android 9 мы обновили портретный режим поворота, чтобы исключить непреднамеренный поворот, зафиксировав текущий поворот экрана, даже если положение устройства изменится. При необходимости пользователи могут запускать вращение вручную, нажав новую кнопку на панели навигации. Мы переименовали портретный режим в «Блокировка вращения», и он активируется, когда автоматический поворот отключен. В режиме автоповорота изменений нет.

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

Режим блокировки вращения работает путем отображения кнопки на панели навигации при изменении поворота устройства. Для этого датчик ориентации устройства должен оставаться активным, даже если автоповорот отключен. Нажатие этой кнопки эффективно устанавливает предпочтения ротации пользователей ( Settings.System.USER_ROTATION ). WindowManager использует эту настройку, а также другие сведения о верхней активности и состоянии системы, чтобы изменить ротацию системы. WindowManager продолжает использовать предпочтения вращения пользователя при принятии решения о том, в каком повороте отображать систему при переходе к другому действию.

На этой гифке изображен телефон в альбомной ориентации с экраном в книжной ориентации. Появится значок, спрашивающий пользователя, хочет ли он изменить ориентацию экрана на альбомную.
Рисунок 1 . Повернуть кнопку предложения с включенным жестом «Провести вверх по кнопке «Домой»»

Предпочтение ротации пользователей должно сохраняться при перемещении между действиями. Однако, поскольку большинство пользователей телефонов хотят находиться в горизонтальной ориентации только в течение короткого временного периода времени, мы добавили смещение естественной ориентации. Пользовательские настройки вращения сбрасываются на естественную ориентацию устройства каждый раз, когда вращение системы меняется на естественную ориентацию устройства. Для большинства телефонов естественная ориентация устройства — книжная (0°). Сброс предпочтений ротации пользователей часто происходит при использовании приложения только с портретной ориентацией, блокировке телефона или возврате в рабочую область панели запуска.

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

Источник

В Android 9 добавлена ​​поддержка предложений по ротации. Большинство изменений содержится в следующих файлах.

  • services/.../server/policy/PhoneWindowManager.java :
    • Перехватчики, потребляющие выходные данные WindowOrientationListener ( MyOrientationListener , отвечающий за мониторинг датчиков, чтобы определить, было ли устройство повернуто)
    • Сохраняет WindowOrientationListener активным, даже если автоповорот отключен (см. needSensorRunningLp() ).
    • Вычисляет вращение системы с учетом предпочтений вращения пользователя, настроек верхней screenOrientation активности и состояния системы (см. rotationForOrientationLw() ).
    • Определите, может ли верхняя активность вращаться с заданным поворотом (см. isRotationChoicePossible() ).
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Определяет, должна ли кнопка навигационной панели отображаться в обратных вызовах предложения вращения из PhoneWindowManager (см. onRotationProposal() ).
    • Определяет, когда нужно скрыть кнопку поворота панели навигации (см. вызовы setRotateSuggestionButtonState(false) ).
    • Обрабатывает тайм-ауты кнопок, включая особый случай, когда панель навигации скрыта (обычно в полноэкранном режиме).
    • Сбрасывает пользовательские настройки при возврате к естественной ориентации устройства ( mRotationWatcher )
    • Выбирает подходящий стиль для анимации кнопки панели навигации, применяемой в NavigationBarView (см. onRotationProposal() ).
    • Добавляет логику режима введения, включая специализированную анимацию (см. ссылки на Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED ).
    • Реализует флаг вращения Disable2 (см. disable() ).
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Стили анимации значка кнопки в соответствии с ожидающим поворотом (см. updateRotateSuggestionButtonStyle() )
    • Обрабатывает изменения видимости кнопок (см. setRotateButtonVisibility() ), включая логику для скрытия кнопки поворота, если активны определенные службы специальных возможностей (с учетом ранжирования самой правой кнопки панели навигации).
  • SystemUI/res/layout/menu_ime.xml :
    • Включает новый элемент KeyButtonView для кнопки поворота, расположенный над меню и средством выбора IME/клавиатуры, но под кнопкой специальных возможностей.
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Комплекс AnimatedVectorDrawable , используемый для анимации кнопки поворота панели навигации.
    • Стилизация (в SystemUI/res/values/styles.xml ) используется для установки начального и конечного углов вращения, поэтому один и тот же объект можно использовать для анимации различных начальных и конечных поворотов.
    • Цвет значков задается с помощью TintedKeyButtonDrawable .

Выполнение

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

Производителям устройств, создающим устройства с аппаратными клавишами навигации и желающим реализовать эту функцию, необходимо будет разработать и реализовать собственные возможности системного пользовательского интерфейса или отключить эту функцию. Рекомендуется, чтобы любая введенная поверхность была удобной в использовании, когда устройство удерживается под углом 90° или 180° к текущему вращению системы и обеспечивает быстрый доступ. По этим причинам использование уведомлений (как это делается для средства выбора IME/клавиатуры) не рекомендуется.

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

Для обеспечения единообразия реализации необходимо, чтобы предпочтение вращения пользователя ( Settings.System.USER_ROTATION ) сбрасывалось на естественное вращение устройства, когда система по любой причине переходит на естественное вращение устройства, когда автоматический поворот отключен. Предоставленная реализация делает это (см. NavigationBarFragment.mRotationWatcher ).

В StatusBarManager.disable2 появился новый флаг, который временно предотвращает появление предложений по ротации. См. StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Этот флаг необходимо учитывать во всех реализациях, поскольку он используется критически важными системными приложениями, включая мастер установки. Предоставленная реализация поддерживает это (см. NavigationBarFragment.disable() ).

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

Кастомизация

Поскольку предложения по ротации появляются только в режиме блокировки ротации (автоматическая ротация отключена), можно выбрать, включена ли эта функция по умолчанию для новых установок, выбрав отключение автоматической ротации по умолчанию. См. def_accelerometer_rotation в SettingsProvider/res/values/defaults.xml чтобы внести изменения по умолчанию.

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

Проверка

Для тестирования эту функцию можно отключить и включить, изменив значение параметра Settings.Secure . Проще всего это сделать, выполнив следующую команду из привилегированного экземпляра adb:

adb shell settings put secure show_rotation_suggestions <x>

Установите x на 0 для выключения и 1 для включения.

Для тестирования режим введения можно сбросить, изменив связанное значение Settings.Secure . Проще всего это сделать, выполнив следующую команду из привилегированного экземпляра adb:

adb shell settings put secure num_rotation_suggestions_accepted 0