我正在尝试制作一个简单的Android应用程序,当从右到左移动Android设备或将Android设备从Top移动到Button时,此应用程序将获得Direction。仅在2d的运动,例如桌面或棋盘上的Android设备。例如,当从左到右移动时,左值外壳为真,右边值为假,所以
onCreate方法代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
tvLeft= (TextView) findViewById(R.id.textViewLeft);
tvRight= (TextView) findViewById(R.id.textViewRight);
tvTop= (TextView) findViewById(R.id.textViewTop);
tvButton= (TextView) findViewById(R.id.textViewBoutton);
}
onSensorChanged方法代码
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) > 100) {
lastUpdate = curTime;
float diffX=last_x-x;
float diffY=last_y-y;
Log.d("Mhd",Float.toString(diffX)+" X Diff");
Log.d("Mhd",Float.toString(diffY)+" y Diff");
diffX = Float.parseFloat(String.format("%1$,.1f", diffX));
diffY = Float.parseFloat(String.format("%1$,.1f", diffY));
if(x>last_x && Math.abs(diffX) > 0.1){
tvLeft.setText("T");
tvRight.setText("F");
}else if(x<last_x && Math.abs(diffX) > 0.1){
tvRight.setText("T");
tvLeft.setText("F");
}
if(y>last_y && Math.abs(diffY) > 0.1){
tvTop.setText("T");
tvButton.setText("F");
}else if(y<last_y && Math.abs(diffY) > 0.1)
tvButton.setText("T");
tvTop.setText("F");
}
last_x = x;
last_y = y;
last_z = z;
}
}
最后程序没有给出错误 但生成的数据不是真的,当Android设备稳定数据时 生成。
请改进我的代码。
答案 0 :(得分:3)
您需要考虑加速度计的含义及其作用。它基本上是一个力计。它检测设备上的力,并测量它。它总是告诉你当前的力水平(由于重力,它实际上永远不会是0,除非你在外太空)。它不检测运动。它仅在移动时不返回值。它每次询问时都会返回值,SENSOR_DELAY_NORMAL表示每隔几百毫秒。
数据永远不会100%正确。数据总是有噪音,因为所有物理传感器都有。来自旧力量的混响,由于人们在房间里走动而产生的温和力量,你的桌子不是100%稳定 - 传感器将拾取所有这些微小的变化。每次都会有一些错误,因为它们只是如此准确。你只需要寻找大的变化,如果你正在寻找非常小的变化,你需要比手机更好的硬件。
最后,它捕获的力量不是运动。这意味着如果您要以恒定速度移动设备,则不会检测到任何变化 - 恒定速度的物体没有施加力。它只能捕捉速度加速度和减速度的变化。你需要寻找这些,而不是假设一个改变意味着它的移动。例如,向左移动设备会看到向左加速,然后是0加速,然后在停止时向右加速(实际上是减速),然后什么都没有。
您需要重新设计整个方法。您需要更高,更高的噪声阈值,并且您需要查找加速度和减速度以确定它是否在移动,否则您的减速将看起来像是在错误的方向上移动。它比你在这里复杂得多。