我正在开发一个 Android 应用程序,我想知道是否可以检测固定一个轴的运动方向。例如,我想将手机放在桌子上,并在移动时检测方向(左、右、上、下)。距离不是必须的,我只想知道准确的方向。
2 回答
是的。
使用SensorEventListener.onSensorChanged(SensorEvent event)
可以确定沿 X 和 Y 轴提供的值。您需要记录这些值,然后将它们与您在后续调用该onSensorChanged
方法时收到的任何新值进行比较,以获得增量值。如果一个轴上的 delta 值为正,则设备向一侧移动,如果其为负,则向相反方向移动。
您可能需要微调接收加速度计事件的速率和您考虑使用增量值指示方向变化的阈值。
这是我正在谈论的快速代码示例:
public class AccelerometerExample extends Activity implements SensorEventListener {
TextView textView;
StringBuilder builder = new StringBuilder();
float [] history = new float[2];
String [] direction = {"NONE","NONE"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
setContentView(textView);
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent event) {
float xChange = history[0] - event.values[0];
float yChange = history[1] - event.values[1];
history[0] = event.values[0];
history[1] = event.values[1];
if (xChange > 2){
direction[0] = "LEFT";
}
else if (xChange < -2){
direction[0] = "RIGHT";
}
if (yChange > 2){
direction[1] = "DOWN";
}
else if (yChange < -2){
direction[1] = "UP";
}
builder.setLength(0);
builder.append("x: ");
builder.append(direction[0]);
builder.append(" y: ");
builder.append(direction[1]);
textView.setText(builder.toString());
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// nothing to do here
}
}
此代码只会为您提供手机移动的 X 轴和 Y 轴上的大致方向。为了提供更细粒度的方向确定(例如,尝试模拟计算机鼠标的移动),您可能会发现手机的加速度计不适合用途。
为了尝试这个,我首先将传感器延迟设置为SensorManager.SENSOR_DELAY_FAST
并创建多个历史事件的列表,以便我可以检测随时间的运动,而不会受到在以如此精细的加速度计测量时经常发生的相反方向的轻微运动的影响等级。您还需要测量经过的时间量,以帮助计算您评论中建议的准确运动测量值。
根据我的阅读,使用传感器只能检测加速度和手机方向。因此,您可以轻松地检测到运动的开始(以及在哪个方向)和运动的停止,因为速度正在变化,因此存在加速度(当停止加速度时与速度方向相反)。
如果手机以恒定速度移动,加速度计将给出零值(减去重力的线性加速度)。所以为了知道手机是否在移动,你应该计算每个瞬间的速度,通过
V(t)=V(t-1)+a*dt
其中:
V(t-1)
是前一时刻的已知速度,V(t)
是当前时刻的速度,a
是加速度(考虑前一瞬间的加速度或前一瞬间和当前瞬间之间的平均加速度)。
问题在于,由于传感器值的不确定性,您最终可能会在每个瞬间汇总小误差,这将导致错误的速度值。可能您必须将低通滤波器调整为这些值。