我有一個相當簡單的要求。假設設備垂直於地面,垂直於地面並傾斜,則需要確定手機是向前還是向後傾斜(屏幕朝向地面或更靠近天花板)。如何使用Android傳感器事件來確定設備是朝上還是朝下
我知道如何從各種傳感器讀取數值,我認爲使用傳感器TYPE_ROTATION_VECTOR是前進的方向。我所缺少的是數學知識來確定它返回的三個值的前進或後退。
我讀過所有相關的線索,因此沒有啓蒙,非常感謝任何幫助。
我有一個相當簡單的要求。假設設備垂直於地面,垂直於地面並傾斜,則需要確定手機是向前還是向後傾斜(屏幕朝向地面或更靠近天花板)。如何使用Android傳感器事件來確定設備是朝上還是朝下
我知道如何從各種傳感器讀取數值,我認爲使用傳感器TYPE_ROTATION_VECTOR是前進的方向。我所缺少的是數學知識來確定它返回的三個值的前進或後退。
我讀過所有相關的線索,因此沒有啓蒙,非常感謝任何幫助。
X軸水平指向右側,Y軸垂直指向上方,Z軸指向屏幕正面的外側。在這個系統中,屏幕後面的座標具有負Z值。
參考座標系統被定義爲直接正交基,其中:
X is defined as the vector product Y.Z (It is tangential to the ground at the device's current location and roughly points East).
Y is tangential to the ground at the device's current location and points towards magnetic north.
Z points towards the sky and is perpendicular to the ground.
在你的情況試試這個,
if(Round(y,4) < 8.0){
Log.d("sensor", "=====UP====");
}
else if(Round(y,4) < -8.0){
Log.d("sensor", "=====DOWN====");
}
float[] rotationMatrix = new float[9];
float[] inclinationMatrix = new float[9];
float[] accelerometer; // values from sensor
float[] magnetic; // values from sensor
SensorManager.getRotationMatrix(rotationMatrix, inclinationMatrix, accelerometer, magnetic)
int inclination = (int) Math.round(Math.toDegrees(Math.acos(rotationMatrix[8])));
if (inclination < 90)
{
// face up
}
if (inclination > 90)
{
// face down
}
可以使用加速計和磁場傳感器來檢測這一點。
我發現這個有用的博客文章,其中有必要的代碼,告訴你如何做到這一點。
http://www.ahotbrew.com/how-to-detect-forward-and-backward-tilt/
感謝您的快速響應。在聽起來甚至比我更笨的風險下,你的Round()函數是指什麼? – PaulJNewell