2012-04-28 40 views
1

我正在執行我自己的相機活動。 要旋轉拍攝的圖像,我需要知道拍攝時的方向。 是否有更高級別的API,用於傳感器值俯仰和橫滾,告訴我我的設備取向爲:

自上而下 - 拿着手機正常,人像
下頂
右 - 左 - 景觀頂部的手機是在右側
左 - 右側 - 風景手機的頂部是在左側傳感器值的更高級別的API Pitch and Roll

或者是否有任何其他方式從它直接從系統?

+0

你是什麼意思自上而下,..左 - 右? – zapl 2012-04-28 22:43:27

+0

您可以編寫一個函數來檢查它並在需要時調用它。另外,如果你想讓人們回答你的問題,你應該接受答案。看看你的舊答案,並接受最好的答案。該按鈕處於答案評級。 – 2012-04-28 22:46:08

+0

謝謝你的建議,我看看那個功能 – strangeoptics 2012-04-28 22:48:00

回答

1

不幸的是,當他們不處於橫向模式(這是Android上相機的「自然」方向)時,相機在Android上以奇怪的方式工作。

要做的最好的事情是將活動設置爲橫向模式,並添加onConfigurationChanged事件(並將android:configChanges =「orientation」添加到清單中)以獲取當前方向。

捕捉圖像時,檢查方向並根據您希望擁有的任何邏輯進行操作。

+0

好點。我不知道像onConfigurationChanged事件存在。我試了一下,它只能告訴我,如果我在縱向或橫向模式。相機傳感器有一個方向,但是當相機向右或向左轉時,風景可以有兩個方向。我需要一種方法來確定如何旋轉結果。 – strangeoptics 2012-04-29 07:21:13

+0

如果你的目標是2.2+,你可能會有這樣的運氣:http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 – 2012-04-29 07:29:13

+0

API的另一個很好的API我沒有聽說過的;)我嘗試過,但它顯示我總是0度。 int rotation = getWindowManager()。getDefaultDisplay()。getRotation();也許這是因爲我將清單中的方向設置爲固定。 – strangeoptics 2012-04-29 07:55:30

1

好的解決了我的問題到了一定程度,以至於它對我有用,而且我忽略了頂層的識別。

public class DeviceOrientation { 

public static final int ORIENTATION_PORTRAIT = 0; 
public static final int ORIENTATION_LANDSCAPE_REVERSE = 1; 
public static final int ORIENTATION_LANDSCAPE = 2; 
public static final int ORIENTATION_PORTRAIT_REVERSE = 3; 

int smoothness = 1; 
public float averagePitch = 0; 
public float averageRoll = 0; 
public int orientation = ORIENTATION_PORTRAIT; 

private float[] pitches; 
private float[] rolls; 

public DeviceOrientation(int smoothness) { 
    this.smoothness = smoothness; 

    pitches = new float[smoothness]; 
    rolls = new float[smoothness]; 
} 

public void addSensorEvent(SensorEvent event) { 
    azimuth = event.values[0]; 

    averagePitch = addValue(event.values[1], pitches); 
    averageRoll = addValue(event.values[2], rolls); 

    orientation = calculateOrientation(); 
} 

private float addValue(float value, float[] values) { 
    float average = 0; 

    for(int i=1; i<smoothness; i++) { 
     values[i-1] = values[i]; 
     average += values[i]; 
    } 
    values[smoothness-1] = value; 
    average = (average + value)/smoothness; 

    return average; 
} 

/** handles all 4 possible positions perfectly */ 
private int calculateOrientation() { 
    // finding local orientation dip 
    if (((orientation == ORIENTATION_PORTRAIT || orientation == ORIENTATION_PORTRAIT_REVERSE) 
      && (averageRoll > -30 && averageRoll < 30))) { 
     if (averagePitch > 0) 
      return ORIENTATION_PORTRAIT_REVERSE; 
     else 
      return ORIENTATION_PORTRAIT; 
    } else { 
     // divides between all orientations 
     if (Math.abs(averagePitch) >= 30) { 
      if (averagePitch > 0) 
       return ORIENTATION_PORTRAIT_REVERSE; 
      else 
       return ORIENTATION_PORTRAIT; 
     } else { 
       if (averageRoll > 0) { 
        return ORIENTATION_LANDSCAPE_REVERSE; 
       } else { 
        return ORIENTATION_LANDSCAPE; 
       } 
     } 
    } 
} 

說明: 如果我在肖像模式和tillt美孚,直到其處於水平位置,將切換到橫向由於代碼的其餘部分。 因此,我檢查它是否在肖像,並使條件很難leaiff這種模式。 這是我與當地的傾角。其餘的只是分成3個方向。

有一件事是不好的。如果設備處於landscape_x狀態,並且稍微向後傾斜一點,則該設備從〜2跳到〜175。那時我的代碼在風景和肖像之間掠過。

平滑度將通過組合最後n個值並計算平均值來平滑傳感器數據的值。這不是真的需要。

我希望這會幫助別人。如果您可以進一步改進代碼,請讓我知道。

+0

請放下其餘的代碼...請好嗎? – 2012-04-29 12:56:35

+0

代碼已更新。與它一起玩的完整項目是在我的谷歌驅動器上。 [SensorDemo.rar](https://docs.google.com/open?id=0B4dC-qLD0ltec3BteVNBTDB2OFU) – strangeoptics 2012-04-30 07:07:11

+0

謝謝。 「不完美卻能工作95%」是什麼意思? – 2012-04-30 08:25:06

相關問題