Определение ориентации устройства
Мне нужно обнаружить изменение ориентации устройства android, не играя вручную с данными датчиков, сохраняя при этом ориентацию активности на некоторую ориентацию
onConfigurationChange
не будет работать, так как будет прилипать моя деятельность, чтобы не вращаться.
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) {
return;
}
//getResources().getConfiguration().orientation;
if (event.values[1] < 6.5 && event.values[1] > -6.5) {
if (orientation!=1) {
Log.d("Sensor", "Protrait");
}
orientation=1;
} else {
if (orientation!=0) {
Log.d("Sensor", "Landscape");
}
orientation=0;
}
}
Это действительно требует реальной обработки данных, такой как фильтрация от шума и внезапных коротких встряхиваний / вращений.
Итак, есть идеи, как можно определить ориентацию устройства с помощью устаревших сервисов ? (Еще раз, я буду придерживаться своей деятельности в некоторой ориентации, так что onConfigurationChange
не будет работать)
3 ответа:
Существует слушатель для события ориентации.
Так что вопрос упоминания реализации этого слушателя.
Пример кода для того же здесь в этом блоге
Я надеюсь, что это поможет вам
Моя активность всегда будет находиться в портретном режиме. Поставьте этот код onCreate.
myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) { public void onOrientationChanged(int arg0) { if (arg0>=315 || arg0<45){ currentOrientation = Surface.ROTATION_90; }else if (arg0>=45 && arg0<135){ currentOrientation = Surface.ROTATION_180; }else if (arg0>=135 && arg0<225){ currentOrientation = Surface.ROTATION_270; }else if (arg0>=225 && arg0<315){ currentOrientation = Surface.ROTATION_0; } } };
Установив свойство
screenOrientation
в Манифесте, вы больше не сможете получить значение ориентации изonConfigurationChanged
, так как оно перестанет срабатывать, можно реализоватьSensorEventListener
, чтобы получитьPitch
,roll
иyaw
углы для вычисления ориентации, но это немного сложно и излишне для такой задачи. Лучшее решение, которое я нашел, это использоватьOrientationEventListener
, следующий код обновит значение поворота при изменении ориентации, значение от 0 до 4 в зависимости от угла поворота:private OrientationEventListener listener; private int rotation; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.main); listener = new OrientationEventListener (this, SensorManager.SENSOR_DELAY_NORMAL) { @Override public void onOrientationChanged (int orientation) { rotation = ((orientation + 45) / 90) % 4; } }; if (myOrientationEventListener.canDetectOrientation()) listener.enable(); else listener = null; // Orientation detection not supported } @Override protected void onDestroy() { super.onDestroy(); if (listener != null) listener.disable(); }