0

我试图找出用板载加速度计按下按钮的力。我想我必须做一系列读数,然后比较这些值。我的尝试是这样的:

  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;


}

}

4

2 回答 2

0

在您的 for 循环中,您被迫Thread

...
    Thread.sleep(1);
...

其中预期的参数(在您的情况下为 1)以毫秒为单位。

我想,你的意图不是强迫Thread睡眠 1 毫秒,因为你想要传感器的实际值。所以应该是这样的:

...
    Thread.sleep(x * 1000);
...

其中x是关于灵敏度定义的。

于 2012-11-09T09:58:19.580 回答
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) 来获得一系列读数中的最高值。

于 2012-11-13T14:42:29.890 回答