我正在制作一款使用该设备的加速计来填充进度条的游戏。 在我的笔记2上,我需要大约20秒左右摇动手机才能填满酒吧,不过我尝试使用中兴刀片并花了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);
}
}
答案 0 :(得分:0)
问题可能是使用Accelerometer的频率。注册时不要在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);
希望它能解决。
答案 1 :(得分: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;
}
需要考虑的事项:
我这样做是因为它可以保证您不会比限制更快地收到事件。