我试图通过下面的代码检测正确的手机摇动,但它无法正常工作,例如,当我向左摇动手机时,我经常得到 RIGHT
或同时得到 右
和左
:
@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;
}
}
}
更新后:
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。然后,当您的手停止时,您会在减速时看到负加速度(向左加速度),当您停止时加速度再次达到 0。
换句话说,您将始终看到每个 Action 的正/负对。当您看到两者时,那是因为它们中的每一个都足够强大以触发过滤器。当你看到错误的时候,这意味着加速太慢而无法触发它,但减速足够快。你没有足够长的时间去抖动 - 为了让你的摇晃检测不到减速,它必须是一个在 200 毫秒内开始和结束的向右移动。不够长。如果您想要真正好的结果,您应该研究 DSP 算法,但复习所有这些概念本身就是一本小书。
还请记住,加速度响起。加速度计的物理工作方式 - 想象一个被重物拉伸(stretch)的 Spring 。它会超过中位数,然后反弹并重复多次。该波对后来数据的干扰会带来奇怪的结果。强烈的响声甚至可能会多次触发您的过滤器。
哦,你也不应该在这里使用 currentTimeMillis。传感器事件有一个时间字段。那是事件真正发生的时候。如果系统繁忙,可能需要几百毫秒才能处理事件。使用事件字段中的时间,而不是您处理它的时间。解决这个问题可能会有所帮助,但会留下其他问题。
关于Android检测正确的手机震动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38238721/