对于一个类项目,我需要使用加速度计识别手势。 我目前对 x、y 和 z 值使用 if 语句的显式方法。
我了解到动态时间包裹是一种更有效的方法,因为它检查手势与先前存储的手势之间的匹配。
我将如何在 Android 中编写此代码,因为我似乎无法在网上找到任何内容。
public void onSensorChanged(SensorEvent event) {
final float alpha = (float) 0.8;
// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
// Remove the gravity contribution with the high-pass filter.
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
float x1 = linear_acceleration[0];
float y1 = linear_acceleration[1];
float z1 = linear_acceleration[2];
x.setText("X: "+ x1);
y.setText("Y: "+ y1);
z.setText("Z: " + z1);
if(y1 < -2 && z1 > 2)
{
action.setText("Phone Moved Forward!!");
image.setVisibility(View.VISIBLE);
image.setImageResource(R.drawable.forwardarrow);
}
else if(y1 < -2 && z1 < -2)
{
action.setText("Phone Moved Toward Face!!");
image.setVisibility(View.VISIBLE);
image.setImageResource(R.drawable.backarrow);
}
else if(y1 < -2 && x1 > 2)//y down, x up = left tilt
{
action.setText("Phone Titled Left!");
image.setVisibility(View.VISIBLE);
image.setImageResource(R.drawable.leftarrow);
}
else if(y1 < -2 && x1 < -2)//y down, x down = right tilt
{
action.setText("Phone Titled Right!");
image.setVisibility(View.VISIBLE);
image.setImageResource(R.drawable.rightarrow);
}
else
{
image.setVisibility(View.GONE);
action.setText("Stable");
}
}
最佳答案
我已将存储库上传到 GitHub,其中演示了 an example加速度计数据的动态时间规整;您可能会发现它很有用!
关于java - Android 加速计 - 动态时间扭曲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35876388/