我正试图通过以下代码检测到正确的手机震动,但是它无法正常工作,例如,当我向左摇动手机时,我得到RIGHT
或同时获得RIGHT
和LEFT
:
@Override
public void onSensorChanged(int sensor, float[] values) {
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// only allow one update every 100ms.
if ((curTime - lastUpdate) > 200) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
x = values[SensorManager.DATA_X];
y = values[SensorManager.DATA_Y];
z = values[SensorManager.DATA_Z];
if (Round(x, 4) > 10.0000) {
Toast.makeText(this, "Right shake detected", Toast.LENGTH_SHORT).show();
} else if (Round(x, 4) < -10.0000) {
Toast.makeText(this, "Left shake detected", Toast.LENGTH_SHORT).show();
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
POST UPDATED:
if (Utils.Round(x, 4) > 8.0000) {
//left
} else if (Utils.Round(x, 4) < -8.0000) {
//right
} else if (z > 9 && z < 10)
//down
else if (z > -10 && z < -9)
//up
答案 0 :(得分:2)
考虑一下加速度计的工作原理。它检测加速度。当您将手机向右移动时,您将获得向右的加速度,然后在以恒定速度移动时获得0。当你的手停止时,你会在减速时看到负加速度(向左加速度),当你停止时加速度再次达到0。
换句话说,您将始终看到每个动作的正/负对。当你看到两者时,那是因为它们中的每一个都足以触发过滤器。当你看错了,这意味着加速度太慢而无法触发它,但减速速度足够快。你没有进行足够长时间的去抖动 - 因为你的震动没有检测到它必须是向右移动的减速度,它在200ms开始和结束。不够长。如果你想要非常好的结果,你应该研究DSP算法,但是重复所有这些概念本身就是一本小书。
还要记住加速度响。加速度计的工作方式是对由弹簧拉伸的弹簧进行物理成像。它将超过中位数,然后反弹并多次这样做。该波与后来的数据的干扰会带来奇怪的结果。甚至可能有一个强大的环可以多次跳闸过滤器。
哦,你也不应该在这里使用currentTimeMillis。传感器事件具有时间字段。那是事件发生的时候。如果系统繁忙,可能会在事件处理前几百毫秒。在事件字段中使用时间,而不是您在其中处理时间。修复可能会有所帮助,尽管它会留下其他问题。