2016-01-22 61 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);