2016-01-22 59 views
0

我在我的應用程序中做了一個小實驗,我試圖繪製一條線來移動/旋轉,以便它始終與地面平行。因此,例如,如果電話傾斜45度,則該線將以相反的方向旋轉45度。在Android上繪製一條總是與地面平行的線

這是我目前實施:

我使用OrientationEventListener得到方向改變。我得到的數據如下所示:

01-21 18:20:51.783 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 300 
01-21 18:20:51.848 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 289 
01-21 18:20:51.912 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 283 
01-21 18:20:52.042 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 278 
01-21 18:20:52.109 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 272 
01-21 18:20:52.173 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 266 
01-21 18:20:52.237 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 261 
01-21 18:20:52.302 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 255 
01-21 18:20:52.366 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 252 
01-21 18:20:52.430 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 248 
01-21 18:20:52.560 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 246 
01-21 18:20:52.690 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 248 
01-21 18:20:52.755 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 251 
01-21 18:20:52.819 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 254 
01-21 18:20:52.883 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 258 
01-21 18:20:52.949 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 260 
01-21 18:20:53.016 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 264 
01-21 18:20:53.079 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 267 
01-21 18:20:53.145 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 274 
01-21 18:20:53.208 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 277 
01-21 18:20:53.273 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 281 
01-21 18:20:53.337 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 284 
01-21 18:20:53.403 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 289 
01-21 18:20:53.467 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 293 
01-21 18:20:53.532 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 298 
01-21 18:20:53.855 28956-28956/com.myapp.test D/DeviceOrientationManager: .onOrientationChanged() - entered - 295 

從這些數據中可以看出,我得到一個新的方向時沒有一致性。另一個問題是,這種方向可以「跳過」一些步驟並跳躍任何程度。

經過一番計算,由我多麼需要旋轉我行決定,我使用旋轉如下:

mLine.animate().setInterpolator(new LinearInterpolator()).rotation(
      degrees).setDuration(60); 

而這個工程確定爲在視圖做動畫()讓我取消以前動畫並從同一點恢復到新的旋轉值。然而這條線感覺有點顫抖和呆滯。如果我慢慢旋轉設備,線條看起來不錯,但是如果我旋轉得更有力,它會稍微延遲一點。我認爲這與我設置的旋轉持續時間有關,手機旋轉速度越快應該會降低我用於動畫的持續時間。但是,我不確定如何計算以及所有我已經嘗試過,只會讓情況變得更糟。

回答

1

而不是使用OrientationEventListener,而應該使用Rotation Vector Sensor。該傳感器爲您提供了在一個座標系統,該系統是相對於重力的實時傳感器數據:

  • X定義爲向量積Y X Z的是切向於地面的設備的當前位置和分大約東。
  • Y在設備當前位置與地面相切並指向地磁北極。
  • Z指向天空並垂直於地平面。

因此,您正在尋找的角度是與X軸的夾角。

private SensorManager mSensorManager; 
private Sensor mSensor; 
... 
mSensorManager = 
    (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);