Подтвердить что ты не робот

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

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

  • Определите текущую ориентацию макета устройства (Портрет, Пейзаж-Влево, Портрет (вверх ногами), Пейзаж-Вправо)
  • Разделите два возможных ландшафтных режима (опираясь на левую сторону, опираясь на правую сторону)
  • Поддерживающие устройства, которые имеют ландшафт как свое естественное состояние (например, обсуждалось здесь)
  • Поддержка < 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(). Ориентация, но иметь возможность указать, в каком ландшафтном режиме это.

4b9b3361

Ответ 1

Правый пейзаж не поддерживался до 2.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;       
    }
}

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