2014-11-24 67 views
7

我需要一些非常簡單的東西,但我找不到合適的示例來學習。我的唯一的目的是以如下:獲取旋轉度和度數顯示


當裝置被置於平的(在它的後面)在桌子上,它應該爲X和Y軸顯示0(或接近於0)。當我從頂部(揚聲器所在的位置)和底部(麥克風所在的位置)將其擡起時,它應該顯示手機傾斜了多少度數。在數學上描述 - 以度數表示手機背面和桌子之間的角度,對於其中一個軸。當我擡起底部(頂部保持放下),然後顯示負度。

對於其他軸也是如此 - 將手機圍繞其長邊旋轉。


我試着組裝來自不同實例的應用程序,使用陀螺儀或加速或旋轉矢量傳感器,但遲遲不來的東西正常工作。

有人可以給我一個onSensorChanged函數的例子(因爲所有的工作都在這裏進行),並告訴我使用了哪個傳感器,所以我知道要註冊什麼?

回答

13

網上有幾個例子和教程,但要小心。 Sensor.TYPE_ORIENTATION已被棄用。您需要通過偵聽這兩個傳感器Sensor.TYPE_ACCELEROMETERSensor.TYPE_MAGNETIC_FIELD來計算旋轉。

在註冊接收來自這些傳感器的通知後,棘手的部分是弄清楚如何處理從它們接收到的數據。關鍵部分如下:

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     mGravity = event.values; 

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     mGeomagnetic = event.values; 

    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 

     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      azimut = orientation[0]; // orientation contains: azimut, pitch and roll 
      pitch = orientation[1]; 
      roll = orientation[2]; 
     } 
    } 
} 

這是你應該如何在onSensorChanged(SensorEvent event)回調來計算方位角,俯仰,滾轉設備的價值。請記住,「上面的所有三個角度都是弧度,逆時針方向是正值」。您可以簡單地將它們轉換爲度數Math.toDegrees()

正如Louis CAD在評論中指出的那樣,將I,R和方向陣列的初始化從onSensorChanged回調中移出是一個好主意,因爲它經常被調用。創建GC並將它們留在GC後面對您的應用程序性能不利。爲了簡單起見,我將它留在那裏。

根據您的設備旋轉的方式,您可能需要重新映射座標才能得到您想要的結果。您可以在android documentation

示例代碼閱讀更多關於remapCoordinateSystem也關於getRotationMatrixgetOrientationhttp://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

+0

嗨喬鮑,我也跟着你的例子,它給了非常可靠的價值,但我希望得到這些順時針方向的正值是可能的?我需要對現有代碼進行哪些更改? – 2015-12-23 18:55:48

+0

@ParagKadam我猜你只需要從360減去逆時針度,你會得到順時針程度是這樣的: '浮動順時針= 360 - 逆時針;' 因此,如果逆時針值爲15,順時針則值爲345. – 2015-12-27 20:44:08

+0

是的......非常感謝:) – 2015-12-28 09:48:34

0

在文件夾res/values-landres/values-port使用以下內容創建文件layouts.xml

RES/values-land/layouts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">true</bool> 
</resources> 

res/values-port/layouts。XML:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">false</bool> 
</resources> 

在你的源代碼,您現在可以訪問當前方向如下:

context.getResources().getBoolean(R.bool.is_landscape)