Хорошо, решил мою проблему до определенного момента, чтобы она работала для меня, и я не учитывал нижестоящее признание.
public class DeviceOrientation {
public static final int ORIENTATION_PORTRAIT = 0;
public static final int ORIENTATION_LANDSCAPE_REVERSE = 1;
public static final int ORIENTATION_LANDSCAPE = 2;
public static final int ORIENTATION_PORTRAIT_REVERSE = 3;
int smoothness = 1;
public float averagePitch = 0;
public float averageRoll = 0;
public int orientation = ORIENTATION_PORTRAIT;
private float[] pitches;
private float[] rolls;
public DeviceOrientation(int smoothness) {
this.smoothness = smoothness;
pitches = new float[smoothness];
rolls = new float[smoothness];
}
public void addSensorEvent(SensorEvent event) {
azimuth = event.values[0];
averagePitch = addValue(event.values[1], pitches);
averageRoll = addValue(event.values[2], rolls);
orientation = calculateOrientation();
}
private float addValue(float value, float[] values) {
float average = 0;
for(int i=1; i<smoothness; i++) {
values[i-1] = values[i];
average += values[i];
}
values[smoothness-1] = value;
average = (average + value)/smoothness;
return average;
}
/** handles all 4 possible positions perfectly */
private int calculateOrientation() {
// finding local orientation dip
if (((orientation == ORIENTATION_PORTRAIT || orientation == ORIENTATION_PORTRAIT_REVERSE)
&& (averageRoll > -30 && averageRoll < 30))) {
if (averagePitch > 0)
return ORIENTATION_PORTRAIT_REVERSE;
else
return ORIENTATION_PORTRAIT;
} else {
// divides between all orientations
if (Math.abs(averagePitch) >= 30) {
if (averagePitch > 0)
return ORIENTATION_PORTRAIT_REVERSE;
else
return ORIENTATION_PORTRAIT;
} else {
if (averageRoll > 0) {
return ORIENTATION_LANDSCAPE_REVERSE;
} else {
return ORIENTATION_LANDSCAPE;
}
}
}
}
Объяснение: Если я в портретном режиме и tillt на мобил вперед, пока она не находится в горизонтальном положении, было бы переключиться на пейзаж за счет остальной части кода. Поэтому я проверяю, находится ли он в портрете и затрудняет условия для этого режима. Это то, что я считаю местным провалом. Остальное просто делится на все 3 направления.
Одна вещь - это плохо. Если устройство находится в landscape_x и получает несколько градусов назад, пик перескакивает от ~ 2 до ~ 175. В этот момент мой код переворачивается между пейзажем и портретом.
Гладкость сгладит значение данных датчика, объединив последние значения n и вычислив среднее значение. Это не обязательно.
Надеюсь, это поможет другим. Если вы можете улучшить код дальше, пожалуйста, дайте мне знать.
Что вы подразумеваете под сверху вниз, .. левый-правый? – zapl
Вы можете просто написать функцию, которая проверяет это и называет ее всякий раз, когда вам нужно. Кроме того, вы должны принять ответы, если хотите, чтобы люди ответили на ваши вопросы. Взгляните на свои старые ответы и примите самые лучшие. Кнопка находится в рейтинге ответов. –
спасибо за это советую, я смотрю на эту функцию – strangeoptics