我正在執行我自己的相機活動。 要旋轉拍攝的圖像,我需要知道拍攝時的方向。 是否有更高級別的API,用於傳感器值俯仰和橫滾,告訴我我的設備取向爲:
自上而下 - 拿着手機正常,人像
下頂
右 - 左 - 景觀頂部的手機是在右側
左 - 右側 - 風景手機的頂部是在左側傳感器值的更高級別的API Pitch and Roll
或者是否有任何其他方式從它直接從系統?
我正在執行我自己的相機活動。 要旋轉拍攝的圖像,我需要知道拍攝時的方向。 是否有更高級別的API,用於傳感器值俯仰和橫滾,告訴我我的設備取向爲:
自上而下 - 拿着手機正常,人像
下頂
右 - 左 - 景觀頂部的手機是在右側
左 - 右側 - 風景手機的頂部是在左側傳感器值的更高級別的API Pitch and Roll
或者是否有任何其他方式從它直接從系統?
不幸的是,當他們不處於橫向模式(這是Android上相機的「自然」方向)時,相機在Android上以奇怪的方式工作。
要做的最好的事情是將活動設置爲橫向模式,並添加onConfigurationChanged事件(並將android:configChanges =「orientation」添加到清單中)以獲取當前方向。
捕捉圖像時,檢查方向並根據您希望擁有的任何邏輯進行操作。
好點。我不知道像onConfigurationChanged事件存在。我試了一下,它只能告訴我,如果我在縱向或橫向模式。相機傳感器有一個方向,但是當相機向右或向左轉時,風景可以有兩個方向。我需要一種方法來確定如何旋轉結果。 – strangeoptics 2012-04-29 07:21:13
如果你的目標是2.2+,你可能會有這樣的運氣:http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 – 2012-04-29 07:29:13
API的另一個很好的API我沒有聽說過的;)我嘗試過,但它顯示我總是0度。 int rotation = getWindowManager()。getDefaultDisplay()。getRotation();也許這是因爲我將清單中的方向設置爲固定。 – strangeoptics 2012-04-29 07:55:30
好的解決了我的問題到了一定程度,以至於它對我有用,而且我忽略了頂層的識別。
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個值並計算平均值來平滑傳感器數據的值。這不是真的需要。
我希望這會幫助別人。如果您可以進一步改進代碼,請讓我知道。
請放下其餘的代碼...請好嗎? – 2012-04-29 12:56:35
代碼已更新。與它一起玩的完整項目是在我的谷歌驅動器上。 [SensorDemo.rar](https://docs.google.com/open?id=0B4dC-qLD0ltec3BteVNBTDB2OFU) – strangeoptics 2012-04-30 07:07:11
謝謝。 「不完美卻能工作95%」是什麼意思? – 2012-04-30 08:25:06
你是什麼意思自上而下,..左 - 右? – zapl 2012-04-28 22:43:27
您可以編寫一個函數來檢查它並在需要時調用它。另外,如果你想讓人們回答你的問題,你應該接受答案。看看你的舊答案,並接受最好的答案。該按鈕處於答案評級。 – 2012-04-28 22:46:08
謝謝你的建議,我看看那個功能 – strangeoptics 2012-04-28 22:48:00