我创建了一个速度计应用程序,它使用加速度计来计算设备速度。这是代码: `package com.exacmple.speedo;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class Speedometer extends Activity {
SensorManager sensorManager;
TextView myTextView;
float appliedAcceleration = 0;
float currentAcceleration = 0;
float velocity = 0;
Date lastUpdate;
Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTextView = (TextView) findViewById(R.id.myTextView);
lastUpdate = new Date(System.currentTimeMillis());
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(sensorListener,
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_FASTEST);
Timer updateTimer = new Timer("velocityUpdate");
updateTimer.scheduleAtFixedRate(new TimerTask() {
public void run() {
updateGUI();
}
}, 0, 1000);
}
private void updateGUI() {
// Convert from m/s to mph
final double mph = (Math.round(100 * velocity / 1.6 * 3.6)) / 100;
// Update the GUI
handler.post(new Runnable() {
public void run() {
myTextView.setText(String.valueOf(mph) + "mph");
}
});
}
private void updateVelocity() {
// Calculate how long this acceleration has been applied.
Date timeNow = new Date(System.currentTimeMillis());
long timeDelta = timeNow.getTime() - lastUpdate.getTime();
lastUpdate.setTime(timeNow.getTime());
// Calculate the change in velocity at the
// current acceleration since the last update.
float deltaVelocity = appliedAcceleration * (timeDelta / 1000);
appliedAcceleration = currentAcceleration;
// Add the velocity change to the current velocity.
velocity += deltaVelocity;
// Convert from meters per second to miles per hour.
double mph = (Math.round(velocity / 1.6 * 3.6));
myTextView.setText(String.valueOf(mph) + "mph");
}
private final SensorListener sensorListener = new SensorListener() {
double calibration;
public void onSensorChanged(int sensor, float[] values) {
double x = values[SensorManager.DATA_X];
double y = values[SensorManager.DATA_Y];
double z = values[SensorManager.DATA_Z];
double a = -1
* Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)
+ Math.pow(z, 2));
if (calibration == Double.NaN)
calibration = a;
else {
updateVelocity();
currentAcceleration = (float) a;
}
}
public void onAccuracyChanged(int sensor, int accuracy) {
}
};
}` 我面临的问题是它在初始速度上没有显示任何变化,在我的情况下是0.0英里/小时。我已经在logcat上检查了它,它显示了速度,但在UI上没有显示任何增量。请帮忙。
答案 0 :(得分:0)
我认为你使用updateGUI处理程序的方法是导致你的问题的原因;以及程序循环中的计时。我试图用你的代码构建你所说的原型,似乎它只想更新一次。然后我做了几个mod,其中一个是删除处理程序。得到这个,当我这样做时,它将仅在模拟器标题横幅(Win7上的双显示器显示设置)上单击并保持一秒时更新textView。从来没有见过类似的东西,但是我假设由于仿真软件中的某种状态变化而启动了该功能。对不起,我无法提供更多帮助,但只是让你知道你正走在正确的道路上。如果我解决了这个程序,我一定会发布结果。
答案 1 :(得分:0)
只需在updateGUI
结束时致电onSensorChanged
即可。如果速度没有改变,更新UI是没有意义的,所以它也更有效率。
答案 2 :(得分:0)
这段代码是不是只能以〜9.8m / s的速度不断累积?也许你只想整合与地球表面相切的分量。