4

我正在制作一个使用设备的加速度计填充进度条的游戏。在我的 Note 2 上,上下晃动手机大约需要 20 秒才能填满条形图,但我在 ZTE Blade 上试了一下,花了 4 秒。

有没有办法在我的代码中校准加速度计?这就是我正在做的事情:

@Override
public void onSensorChanged(SensorEvent event) {

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        if (!mInitialized) {
            mLastX = x;
            mLastY = y;
            mLastZ = z;
            mInitialized = true;
        } else {
            float deltaX = Math.abs(mLastX - x);
            float deltaY = Math.abs(mLastY - y);
            float deltaZ = Math.abs(mLastZ - z);
            if (deltaX < NOISE) deltaX = (float)0.0;
            if (deltaY < NOISE) deltaY = (float)0.0;
            if (deltaZ < NOISE) deltaZ = (float)0.0;
            mLastX = x;
            mLastY = y;
            mLastZ = z;

            if(deltaY == 0){
                return;
            }

            sProgress += deltaY;
            pb.setProgress(sProgress);


        }


}
4

2 回答 2

0

问题可能与加速度计的频率有关。注册时不要使用以下 android 常量。

mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

这些值对于不同的设备是不同的。

int SENSOR_DELAY_FASTEST    get sensor data as fast as possible
int SENSOR_DELAY_GAME   rate suitable for games
int SENSOR_DELAY_NORMAL rate (default) suitable for screen orientation changes
int SENSOR_DELAY_UI rate suitable for the user interface

使用以微秒为单位的硬编码值,例如频率 1 Hz

mSensorManager.registerListener(this, mAccelerometer,1000000);

希望它解决。

于 2013-01-14T22:15:59.913 回答
0

使频率相等的另一种解决方案类似于以下解决方案。

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
  if(sensorEventTooQuick(sensorEvent.timestamp)) {
    return;
  }

  mLastSensorEventTime = sensorEvent.timestamp;

  // process sensor
}

private boolean sensorEventTooQuick(long sensorTime) {
  long diff = sensorTime - mLastSensorEventTime;
  return diff < MINIMUM_SENSOR_EVENT_GAP;
}

需要考虑的事项:

  • 您要确保选择的 MINIMUM_SENSOR_EVENT_GAP 足够小,不会丢失信息。加速度计非常快,因此这通常不是问题,但根据应用程序的不同,其他传感器可能会出现问题。
  • 确保在不同设备上测试不同的值。

我这样做是因为它保证您接收事件的速度不会超过您的限制。

于 2014-11-18T20:03:27.520 回答