我在网上看到了很多答案,而且它们都有相似的复制粘贴代码,但是没有一个人对它们使用的数学有任何解释。我在tutorialspoint上有一个指向该代码的URL,它与我在stackoverflow上看到的答案相同。但是有人可以向我解释这段代码:
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
// What is this doing?
mAccel = mAccel * 0.9f + delta;
if (mAccel > 12) {
Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
}
}
此行应该做什么
mAccel = mAccel * 0.9f + delta;
0.9f是从哪里来的,为什么我们要自己乘以0.9f并加上增量?我的身体不强,所以对我来说并不明显。
https://www.tutorialspoint.com/how-to-detect-shake-event-in-android-app
我也在链接的tutorialspoint页面上查看了代码。我在算法中看到了3个步骤:
mAccelCurrent
计算为当前的加速度绝对值delta
被计算为当前加速度绝对值与先前加速度绝对值之差。这样做是为了消除恒定的加速度值(重力)并放大震动(加速度的变化)。mAccel
被计算为exponential smoothing的delta
,具有0.9系数的一阶滤波,取决于调用此函数的时间,可以为高值或低值(如果为经常调用,这是一个较低的值)。没错,0.1f
乘法似乎丢失了,但是如果查看受保护的void onCreate
函数中的代码,则可以看到mAccel
已初始化为10f
。换句话说,mAccel
是delta
的指数平滑的10倍。 如果愿意,可以使用0.1乘法,将与其相比较的值也减小10倍就足够了(1.2而不是12)