Ответ 1
По существу, здесь есть 2 случая: устройство кладется ровно, а не плоское. Плоскость здесь означает, что угол между поверхностью экрана устройства и плоскостью мира xy (я называю это наклоном) составляет менее 25 градусов или больше 155 градусов. Подумайте о том, что телефон лежит ровно или слегка наклонен немного от стола.
Сначала вам нужно нормализовать вектор акселерометра.
То есть, если g - это вектор, возвращаемый значениями события датчика акселерометра. В коде
float[] g = new float[3];
g = event.values.clone();
double norm_Of_g = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]);
// Normalize the accelerometer vector
g[0] = g[0] / norm_Of_g
g[1] = g[1] / norm_Of_g
g[2] = g[2] / norm_Of_g
Тогда наклон можно рассчитать как
int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2])));
Таким образом,
if (inclination < 25 || inclination > 155)
{
// device is flat
}
else
{
// device is not flat
}
В случае укладки квартиры вам необходимо использовать компас, чтобы узнать, сколько устройство вращается из исходного положения.
В случае неплоской, поворот (наклон) рассчитывается следующим образом:
int rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1])));
Теперь вращение = 0 означает, что устройство находится в нормальном положении. Это портрет без какого-либо наклона для большинства телефонов и, возможно, для планшета. Поэтому, если вы держите телефон как на картинке выше и начинаете вращаться, поворот изменится, и когда телефон будет в пейзаже, вращение будет 90 или -90 зависит от направления вращения.