我需要將手機方向作爲1-360的整數,而不使用OrientationEventListener來檢查onOrientationChanged()android - 如何獲取當前的方向?
可以這樣做嗎?我做了很多谷歌搜索,並沒有得到很多。
謝謝
我需要將手機方向作爲1-360的整數,而不使用OrientationEventListener來檢查onOrientationChanged()android - 如何獲取當前的方向?
可以這樣做嗎?我做了很多谷歌搜索,並沒有得到很多。
謝謝
您可能需要使用加速計來獲得精確的角度。以下是從Vogella採取:
public class SensorTestActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
private boolean color = false;
private View view;
private long lastUpdate;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view = findViewById(R.id.textView);
view.setBackgroundColor(Color.GREEN);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
lastUpdate = System.currentTimeMillis();
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
getAccelerometer(event);
}
}
private void getAccelerometer(SensorEvent event) {
float[] values = event.values;
// Movement
float x = values[0];
float y = values[1];
float z = values[2];
float accelationSquareRoot = (x * x + y * y + z * z)
/(SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
long actualTime = System.currentTimeMillis();
if (accelationSquareRoot >= 2) //
{
if (actualTime - lastUpdate < 200) {
return;
}
lastUpdate = actualTime;
Toast.makeText(this, "Device was shuffed", Toast.LENGTH_SHORT)
.show();
if (color) {
view.setBackgroundColor(Color.GREEN);
} else {
view.setBackgroundColor(Color.RED);
}
color = !color;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
// register this class as a listener for the orientation and
// accelerometer sensors
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
// unregister listener
super.onPause();
sensorManager.unregisterListener(this);
}
}
至於採取什麼樣的角度,這可能幫助:
方位角(旋轉角度繞Z軸)。這是磁北和設備的y軸之間的角度 。例如,如果設備的y軸與磁北對齊,則該值爲0,並且如果設備的y軸指向南,則該值爲180.同樣,當y軸指向東時,該值爲90,並且當指向西是 這個值是270.
針距(圍繞x軸的旋轉度數)。當正z軸朝向正y軸旋轉時,該值爲正, ,當正z軸朝負y軸旋轉時負值爲負。值的範圍是180度到-180度。
卷(圍繞y軸的旋轉度數)。當正z軸朝向正x軸旋轉時,該值爲正值, ,當正z軸朝向負x軸旋轉時爲負值。值的範圍是90度到-90度。
參考:
http://www.vogella.com/tutorials/AndroidSensor/article.html
http://developer.android.com/guide/topics/sensors/sensors_position.html
我從SensorManager類得到了這個。如果有幫助,那就是here。
公共靜態浮動[] getOrientation(浮動[] R,漂浮[]值)
在API級別3 計算基於旋轉矩陣設備的方向。
當它返回,數組值填充有結果:
值[0]:方位,旋轉圍繞Z軸。 值1:俯仰,圍繞X軸旋轉。 values [2]:滾動,圍繞Y軸旋轉。 使用的參考座標系與爲旋轉矩陣定義的世界座標系不同:
X被定義爲矢量乘積YZ(它與設備當前位置的地面相切,大致指向西) 。 Y在設備當前位置與地面相切,並指向磁北極。 Z指向地球中心並垂直於地面。 倒立的世界座標系統圖。 上面的所有三個角度都是弧度,逆時針方向是正的。參數 R旋轉矩陣請參閱getRotationMatrix(float [],float [],float [],float [])。 值爲3個浮點數組來保存結果。 返回 數組值作爲參數傳遞。
參見[檢查Android手機方向](http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone) – ddz
景觀/肖像與旋轉角度完全不同。沒有「簡單」的方法來確定一個確切的角度,最好的方法是使用傳感器。如果你對0/90/180/270沒問題,你可以使用'Display.getRotation()'。 – Geobits
@Geobits看着那個。如果我的活動沒有鎖定在肖像上,它實際上會非常有用:/ – Rob