Как определить ландшафт влево (нормальный) по сравнению с пейзажем вправо (реверс) с поддержкой естественно-ландшафтных устройств? - PullRequest
12 голосов
/ 23 февраля 2011

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

  • Определение текущей ориентации устройства (Портрет, Пейзаж влево, Портрет (вверх ногами), Пейзаж вправо)
  • Различать два возможных режима ландшафта (наклон с левой стороны, наклон с правой стороны)
  • Поддержка устройств, которые имеют естественное состояние ландшафта (, например, , , обсуждаемое здесь )
  • Поддержка <2.2 (невозможно использовать <a href="http://developer.android.com/reference/android/view/Display.html#getRotation%28%29" rel="noreferrer"> getRotation () )

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

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

0 голосов
/ 27 июня 2012

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

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

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

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;       
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...