Я думаю, что X должно быть 0, а y должно быть положительным, в то время как z близко к 0, чтобы компас указывал вниз на землю.
(Что означает, что телефон удерживается в вертикальном положении).
В общем, от угла 0 угол компаса должен быть примерно таким:
float accelerometerMaxRange = 10; // This is NOT right, but it's a good value to work with
float newAngle = 0;
if (z > 9) {
// Phone is horizontally flat, can't point towards gravity, really. Do whatever you think is right
} else {
newAngle = (float)(x * 90 / accelerometerMaxRange);
if (y < 0) {
newAngle = 180 - newAngle;
}
}