检测加速度计震动android
Posted
技术标签:
【中文标题】检测加速度计震动android【英文标题】:Detecting accelerometer shakes android 【发布时间】:2013-01-18 13:45:43 【问题描述】:我正在尝试检测左右晃动和上下晃动。我研究并找到了这段代码。
public void onSensorChanged(SensorEvent event)
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
float[] values = event.values;
// Movement
float x = values[0];
float y = values[1];
float z = values[2];
long actualTime = System.currentTimeMillis();
if ((actualTime - lastUpdate) > 100)
long diffTime = (actualTime - lastUpdate);
lastUpdate = actualTime;
if(Round(x,4)>8.0000)
Log.d("sensor", "=====LEFT====");
else if(Round(x,4)<-8.0000)
Log.d("sensor", "=====RIGHT====");
else if(Round(z,4) < -0.0)
Log.d("sensor", "=====UP====");
else if(Round(y,4) < 1.0)
Log.d("sensor", "=====DOWN====");
float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;
if (speed > SHAKE_THRESHOLD)
//Log.d("sensor", "shake detected w/ speed: " + speed);
//Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show();
last_x = x;
last_y = y;
last_z = z;
我试图研究它,但我有一些问题。 1. 在哪里可以设置每次抖动检测后的延迟?我希望它在最后一次检测到震动的 1 秒后检测到震动。 2. 为什么我把它放在一个平面上,它总是检测到向下。 3. 我无法检测到正确的移动抖动
任何帮助和建议将不胜感激。
【问题讨论】:
【参考方案1】:首先,此代码似乎检测的是运动而不是晃动(我理解晃动是一种单向运动,然后反向运动),这可能会导致您无法理解它的工作原理。
在哪里可以设置每次抖动检测后的延迟?我希望它在最后一次检测到震动的 1 秒后检测到震动。
if ((actualTime - lastUpdate) > 100)
是检测间隔发生的地方 - 这里的 100 告诉程序只查看 100 毫秒后的变化,所以如果你想要 1 秒,请将其更改为 1000
为什么如果我将它放在平坦的表面上,它总是会检测到向下。
我不完全确定这里的上下文和方向,因为它不清楚,但不要忘记你认为的“向下”可能不在你的空间中,但在手机中,向下是仅在手机直立时向下。如果手机在背面,左右是相同的,但向下(即朝向地面)实际上是传感器背面,因为它朝向手机背面。
我无法检测到正确的运动抖动
TBH 我不知道为什么,这里的代码看起来不错。可能是电话问题,可能是实现问题(正如我所说,上面的代码是整体运动,而不是返回的“摇动”,所以它可能是你如何正确地摇动它来测试它不会触发它,但是你的左摇会触发它
【讨论】:
感谢您的解释。好吧,这段代码正好适合我的应用程序。您能否提出一种解决方案来防止将其放置在平面上时发生移动?正确的动作让我头疼。以上是关于检测加速度计震动android的主要内容,如果未能解决你的问题,请参考以下文章