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

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

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

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

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

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

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

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

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

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


person cottonBallPaws    schedule 23.02.2011    source источник


Ответы (2)


Правый ландшафт не поддерживался до 2.2. Вам нужно будет выбрать ‹2.2 устройств в опциях или что-то в этом роде.

person AaronM    schedule 23.02.2011
comment
Что вы имеете в виду под «поддерживаемым»? У меня есть устройство 2.1 (и эмулятор), которое можно повернуть в любой альбомный режим. - person cottonBallPaws; 23.02.2011
comment
@littleFluffyKitty Очень жаль, что это принятый ответ, потому что он на самом деле не отвечает на вопрос (и это хороший вопрос). FWIW, getOrientation эквивалентно getRotation, устаревание просто потому, что оно было переименовано в 2.2. Функциональность существует с уровня API 1. - person Andrew Russell; 08.09.2011

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

Я заметил, что когда ваш экран находится в альбомном режиме, вы получите значения, близкие к -9 (g) или +9 (g) по оси токарного станка (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;       
    }
}

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

person mvalenci    schedule 26.06.2012