Как обнаружить ландшафт влево (нормальный) и правый пейзаж (обратный) с поддержкой естественных ландшафтных устройств?

Что я хотел бы сделать:

  • Обнаружить текущую ориентацию макета устройства (портретная, альбомная, левая, портретная (вверх ногами), пейзаж-правая)
  • Проведите различие между двумя возможными ландшафтными режимами (опираясь на левую сторону, опираясь на правую сторону)
  • Вспомогательные устройства, которые имеют ландшафт как свое естественное состояние ( например , обсуждаются здесь )
  • Поддержка <2.2 (не может использовать getRotation () )

Чтобы уточнить, я хочу знать, в какой ориентации находится макет. В каком направлении находится нижняя часть макета? Это в портрете? Это в пейзаже? Является ли пейзаж левым или правым? и т.п.

Самое близкое, что я могу найти, это Activity.getResources (). GetConfiguration (). Ориентация , но она возвращает только три возможных значения. ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT или ORIENTATION_SQUARE. Он не говорит, какой тип ландшафта.

Поэтому, подумал я, хорошо, если я смогу получить значение ориентации (например, 90, 180, 270 и т. Д.) Устройства и сравнить его с приведенным выше значением конфигурации, я мог бы понять это. Например, если значение конфигурации было ORIENTATION_LANDSCAPE, а ориентация – 270, я мог бы сказать, что он был в обратном ландшафтном режиме. Однако, похоже, нет простого способа получить значение ориентации. Я мог бы реализовать OrientationEventListener , но это кажется излишним, поскольку мне просто нужно получить значение один раз в определенное время, а не постоянно.

В классе Display есть два значения, но getOrientation устарел, а getRotation доступен только для версии 2.2 и выше.

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

Есть много сообщений о SO о ориентации и подобных проблемах, но я не видел никого, кто учитывал бы все эти проблемы. Кто-нибудь понял это?

Когда все будет сказано и сделано, мне хотелось бы что-то вроде Activity.getResources (). GetConfiguration (). Ориентация, но сможете определить, в каком ландшафтном режиме это.

Solutions Collecting From Web of "Как обнаружить ландшафт влево (нормальный) и правый пейзаж (обратный) с поддержкой естественных ландшафтных устройств?"

Правый пейзаж не поддерживался до 2.2. Вам нужно будет выбрать <2.2 устройства в настройках или что-то еще.

Единственный способ, которым мне удалось преодолеть это (без перехода на API 8), – это зарегистрировать его в SensorManager (Sensor.TYPE_ACCELEROMETER) и получить события onSensorChanged.

Я заметил, что когда ваш экран находится в ландшафтном режиме, вы получите близкие значения до -9 (g) или +9 (g) на оси latheral (x). Вы можете просто проверить положительные или отрицательные значения, но вам нужно сохранить состояние в том случае, если устройство вернулось на стол лицом вверх

Ваш код (фрагмент) должен выглядеть примерно так:

 private float mShiftAngle = 0; public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { aValues = event.values; int deviceRot = getResources().getConfiguration().orientation; if (deviceRot == Configuration.ORIENTATION_LANDSCAPE) { if (Math.abs(aValues[0])>4) mShiftAngle = (aValues[0]>0 ? 90 : -90); } else mShiftAngle = 0; } } 

Это помогло мне, надеюсь, это поможет вам.