Ответ 1
Правый пейзаж не поддерживался до 2.2. Вам нужно будет выбрать < 2.2 устройств в настройках или что-то еще.
Что я хотел бы сделать:
Чтобы уточнить, я хочу знать, в какой ориентации находится макет. В каком направлении находится нижняя часть макета? Это в портрете? Это в пейзаже? Является ли пейзаж левым или правым? и др.
Ближайшим я могу найти 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(). Ориентация, но иметь возможность указать, в каком ландшафтном режиме это.
Правый пейзаж не поддерживался до 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;
}
}
это помогло мне, надеюсь, это поможет вам.