2011-05-04 67 views
13

我在兩個不同的設備(Elocity A7和愛可視7家用平板電腦)上測試加速度計輸出,但傳感器似乎給出了不同的結果。我已經編程設置爲橫向模式,但x和y軸似乎是兩個設備之間的對立面。垂直於地面保持x軸返回10,Archos X軸返回0. Elocity平板電腦爲android 2.2,Archos爲2.1。有人能指出我在正確的方向,如何從這兩個設備之間的同步加速度計取向?Android加速度計的方向

回答

7

據我所知這是因爲設備的默認方向。 F.E.帶有蜂窩的新款Android平板電腦在手機上像橫屏一樣擁有縱向定位。

http://developer.android.com/reference/android/hardware/SensorEvent.html

在Android文檔存在這樣的信息:

座標系統相對於手機 在其默認的屏幕方向定義。當設備的屏幕方向改變時,軸不交換。

X軸是水平的並指向右邊,Y軸是 垂直並指向上方,Z軸指向屏幕正面的外側 。在此係統中,屏幕後面的座標具有負Z值。

也許這個設備的其中一個也有風景作爲肖像(默認)方向?

希望它以某種方式幫助你。

4

如前所述,默認屏幕方向因設備而異。加速度計座標將始終與設備的默認方向匹配。屏幕座標的這種行爲是不同的。隨着設備旋轉,屏幕座標也旋轉,使得(0,0)始終是屏幕的當前左上角。在具有縱向默認方向的設備上,將方向鎖定爲縱向將確保傳感器座標沿着與屏幕座標相同的軸運行,而與旋轉無關。另一方面,將屏幕方向鎖定到具有默認橫向方向的設備上的縱向將導致傳感器軸以與屏幕軸不同的方向運行。

本文:http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html更深入地解釋了這一點,並提供瞭解決問題的方法。

15

事實上,加速度計軸相對於設備的默認方向。

這裏如何對付它:

static void canonicalOrientationToScreenOrientation(
     int displayRotation, float[] canVec, float[] screenVec) 
{ 
    final int axisSwap[][] = { 
    { 1, -1, 0, 1 },  // ROTATION_0 
    {-1, -1, 1, 0 },  // ROTATION_90 
    {-1, 1, 0, 1 },  // ROTATION_180 
    { 1, 1, 1, 0 } }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    screenVec[0] = (float)as[0] * canVec[ as[2] ]; 
    screenVec[1] = (float)as[1] * canVec[ as[3] ]; 
    screenVec[2] = canVec[2]; 
} 

此溶液由NVIDIA提供的。檢查他們的white paper關於Android 加速計瞭解更多詳情。

+0

我很抱歉,您在canVec和screenVec上添加了哪些內容? displayrotation我認爲是PROTRAIT或LANDSCAPE常量,對吧? – Dante 2014-04-10 03:31:13

+2

有關更多詳細信息,請查看此鏈接http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf – Hartok 2014-04-10 04:47:40

+0

恕我直言,user1504495對此的重新工作更容易理解。 – ToolmakerSteve 2014-11-07 23:15:03

11

只是想添加一些東西給哈托克的答案,因爲我起初無法理解它......

我已經重寫的方法是:

public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues) 
{ 
    float[] adjustedValues = new float[3]; 

    final int axisSwap[][] = { 
    { 1, -1, 0, 1 },  // ROTATION_0 
    {-1, -1, 1, 0 },  // ROTATION_90 
    {-1, 1, 0, 1 },  // ROTATION_180 
    { 1, 1, 1, 0 } }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    adjustedValues[0] = (float)as[0] * eventValues[ as[2] ]; 
    adjustedValues[1] = (float)as[1] * eventValues[ as[3] ]; 
    adjustedValues[2] = eventValues[2]; 

    return adjustedValues; 
} 

完全一樣的東西,只是更加用戶友好的變量名和我在內部重新浮動,因爲我需要它這樣... 直接讓這個函數,放在getRotation和event.values浮點數組中,檢查它的返回浮點數組的值,並選擇你喜歡的任何數字...

希望這可以幫助別人!

+0

不好意思,但是我把什麼放在displayRotation int?我已經從public void onSensorChanged(SensorEvent事件)中將SensorEvent稱爲事件。我錯過了什麼?我應該添加什麼? – Dante 2014-04-10 01:13:15

+1

您需要顯示器旋轉。 (窗口管理)this.getSystemService(WINDOW_SERVICE).getDefaultDisplay()。getRotation() – user1504495 2014-04-11 13:51:34