我正在开发一个Android应用程序,想知道是否可能在一个轴固定的情况下检测移动方向。例如,我想把我的手机放在桌子上并在移动时检测方向(左、右、上和下)。距离不是必要的,我只想知道准确的方向。
我正在开发一个Android应用程序,想知道是否可能在一个轴固定的情况下检测移动方向。例如,我想把我的手机放在桌子上并在移动时检测方向(左、右、上和下)。距离不是必要的,我只想知道准确的方向。
可以。使用 SensorEventListener.onSensorChanged(SensorEvent event)
方法可以确定沿X和Y轴提供的值。您需要记录这些值,然后将它们与后续调用 onSensorChanged
方法时接收到的任何新值进行比较以获取增量值。如果一条轴上的增量值为正,则设备向一个方向移动,如果为负则相反。
您可能需要微调加速度计事件接收速率和考虑指示方向改变的增量值的阈值。
这是一个简单的代码示例:
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
是加速度(考虑前一个瞬间或前一个和当前瞬间之间的平均加速度)。问题在于由于传感器值的不确定性,您可能会在每个瞬间累加小误差,这将导致错误的速度值。可能需要将低通滤波器调整到这些值。