2014-02-19 63 views
0

我需要將手機方向作爲1-360的整數,而不使用OrientationEventListener來檢查onOrientationChanged()android - 如何獲取當前的方向?

可以這樣做嗎?我做了很多谷歌搜索,並沒有得到很多。

謝謝

+0

參見[檢查Android手機方向](http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone) – ddz

+0

景觀/肖像與旋轉角度完全不同。沒有「簡單」的方法來確定一個確切的角度,最好的方法是使用傳感器。如果你對0/90/180/270沒問題,你可以使用'Display.getRotation()'。 – Geobits

+0

@Geobits看着那個。如果我的活動沒有鎖定在肖像上,它實際上會非常有用:/ – Rob

回答

3

您可能需要使用加速計來獲得精確的角度。以下是從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

0

我從SensorManager類得到了這個。如果有幫助,那就是here

公共靜態浮動[] getOrientation(浮動[] R,漂浮[]值)

在API級別3 計算基於旋轉矩陣設備的方向。

當它返回,數組值填充有結果:

值[0]:方位,旋轉圍繞Z軸。 值1:俯仰,圍繞X軸旋轉。 values [2]:滾動,圍繞Y軸旋轉。 使用的參考座標系與爲旋轉矩陣定義的世界座標系不同:

X被定義爲矢量乘積YZ(它與設備當前位置的地面相切,大致指向西) 。 Y在設備當前位置與地面相切,並指向磁北極。 Z指向地球中心並垂直於地面。 倒立的世界座標系統圖。 上面的所有三個角度都是弧度,逆時針方向是正的。參數 R旋轉矩陣請參閱getRotationMatrix(float [],float [],float [],float [])。 值爲3個浮點數組來保存結果。 返回 數組值作爲參數傳遞。