绘制一条始终与Android平行的线

时间:2016-01-22 21:49:23

标签: android rotation

我正在我的应用程序中进行一些实验,并且我试图绘制一条移动/旋转的线,以便它始终与地面平行。因此,例如,如果手机倾斜45度,则线条反方向旋转45度。

这是我目前的实施:

我使用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);

这可以正常工作,因为在视图上执行animate()允许我取消之前的动画并从同一点恢复到新的旋转值。然而,线路感觉有点摇晃和缓慢。如果我慢慢旋转设备,线条看起来没问题,但是如果我更加剧烈地旋转,它会有一点延迟。我认为这与我设置的旋转持续时间有关,并且手机的更快旋转会降低我用于动画的持续时间。但是,我不确定如何为了计算这一点,我尝试的只是让情况变得更糟。

1 个答案:

答案 0 :(得分: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);