我正试图找出用板载加速度计按下按钮的力。 我想我必须做一系列的读数然后比较这些值。 我的尝试是这样的:
velButton.setOnTouchListener(new OnTouchListener()
{
public boolean onTouch(View view, MotionEvent event)
{
int velocity = 0;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
velocity = getVelocity();
velocityView.setText("This is the velocity: " + velocity);
break;
}
return false;
});
}
protected int getVelocity()
{
float accent = 0;
int velocity;
try
{
accent = getHighestValue();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
velocity = (int) accent;
return velocity;
}
protected float getHighestValue() throws InterruptedException
{
float highest;
float[] value = new float[20];
String txt = "";
for(int i = 0; i < value.length; i++)
{
Thread.sleep(1);
value[i] = accelerometer_z;
txt += "Reading at: " + i + " ms returns: " + value[i] + "\n";
}
Arrays.sort(value);
highest = value[19];
textView2.setText(txt);
return highest;
}
float accelerometer_z在我的主要活动中初始化,并通过onSensorChanged不断更新。
我的问题是我没有获得一系列值,我只从getHighestValue方法中的for循环获得一个值。
干杯 / M
添加了onSensorChanged:
@Override
public void onSensorChanged(SensorEvent event)
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
getAccelerometer(event);
}
}
private void getAccelerometer(SensorEvent event)
{
float[] value = event.values;
// Movement
accelerometer_x = value[0];
accelerometer_y = value[1];
accelerometer_z = value[2];
accelationSquareRoot = (accelerometer_x * accelerometer_x + accelerometer_y *
accelerometer_y + accelerometer_z * accelerometer_z)
/ (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
long actualTime = System.currentTimeMillis();
if (accelationSquareRoot >= 2)
{
if (actualTime - lastUpdate < 200)
{
return;
}
lastUpdate = actualTime;
}
}
答案 0 :(得分:0)
在你的for循环中,你强迫Thread
与
...
Thread.sleep(1);
...
其中预期参数(在您的情况下为1)以毫秒为单位。
我想,你的意图是不要强迫Thread
睡1毫秒,因为你想要传感器的实际值。所以这应该是这样的:
...
Thread.sleep(x * 1000);
...
其中x
是针对敏感度定义的。
答案 1 :(得分:0)
似乎只能同时运行一个事件处理程序,这就是为什么我只从gethighestValue获取单个值的原因。 只要onTouch中的motionEvent等待新输入,onSensorChanged将永远不会被允许进行新的读取。
我通过让onSensorChanged实现这样的方法来解决这个问题:
private void getAccelerometer(SensorEvent event)
{
float[] value = event.values;
float accelerometer_x = value[0];
float accelerometer_y = value[1];
float accelerometer_z = value[2];
accReadingZ.add(accelerometer_z);
while(accReadingZ.size() > LIST_SIZE)
accReadingZ.removeFirst();
}
accReadingZ在这里是一个大小为10个元素的类成员。
我现在可以使用Collections.max(accReadingZ)获取系列读数中的最高值。